【发布时间】:2017-06-11 13:50:35
【问题描述】:
我正在从 GitHub 研究这个解决方案,以解决 Haskell from First Principles 书中提出的问题。这是代码
data Nat =
Zero
| Succ Nat deriving (Eq, Show)
integerToNat :: Integer -> Maybe Nat
integerToNat i
| i < 0 = Nothing
| i == 0 = Just Zero
| i > 0 = Just (Succ x) where (Just x) = integerToNat $ i-1
我很困惑
其中 (Just x) = integerToNat $ i-1
我以为我只能将表达式分配给where 中的标识符。但看起来(Just x) 解包了分配的表达式的值并将x 分配回(Succ x)。
有人能解释一下为什么会这样吗?
【问题讨论】:
-
为什么不呢? ;) 你基本上是正确的,它有点解压rhs。这与适用于函数定义的模式匹配机制相同,例如
natToInteger Zero = 0; natToInteger (Succ x) = 1 + natToInteger x。 -
请记住,即使
where Just x = ...通过模式匹配定义了x,这也可能很危险:当要求x时,如果模式不匹配(例如,因为递归调用返回Nothing),将引发运行时错误,使整个程序崩溃。当然,在这里它永远不会发生,但程序员有责任确保这一点。