我正在从GitHub上研究这个解决方案,以解决Haskell在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)
。
有人可以解释为什么会这样吗?
Haskell上下文自由语法,有一个关于函数右侧(rhs)的条目:
RHS 和右箭头;
=
exp [where
decls]
| GDRHS [where
十三]
因此,这意味着我们必须查看decls
才能获得where
语法。decls
是decl
的序列:
decls → { decl1; ...; decln}
decl
又有两个可能的规则:
德克利阿特罗; 根德克尔
|(funlhs | pat) rhs
因此,这意味着我们可以在where
子句的左侧声明模式(pat)。实际上在where a = 1
中,可以说a
已经是一种模式。该模式由一个变量组成。但是构造函数、别名运算符等都可以在where
子句的左侧使用。
模式可以是变量、泛型构造函数、限定构造函数、文字、通配符、列表模式、元组模式、无可辩驳的模式等。然后可以在这里找到模式的完整语法。简而言之,它的工作方式类似于函数头部的模式匹配。