我正在从GitHub查找这个解决方案,以解决
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)
。
有人可以解释为什么会这样吗?
答案 0 :(得分:4)
Haskell context free syntax有一个关于函数的右侧(rhs)的条目:
rhs→
=
exp [where
decls]
| gdrhs [where
decls]
这意味着我们必须查看decls
以获取where
语法。 decls
是一系列decl
s:
decls→{decl 1 ; ...; decl n }
decl
又有两条可能的规则:
decl→gendecl
| (funlhs | pat)rhs
这意味着我们可以在where
子句的左侧声明模式(pat)。实际上在where a = 1
中,a
已经是一种模式可以这么说了。该模式由一个变量组成。但构造函数,别名运算符等都可以在where
子句的左侧接受。
模式可以是变量,泛型构造函数,合格的构造函数,文学,通配符,列表模式,元组模式,无可辩驳的模式等。然后可以找到模式的完整语法here。因此,简而言之,它就像函数头部的模式匹配一样。