语法在哪里工作?



我正在从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 [wheredecls]
        | GDRHS [where十三]

因此,这意味着我们必须查看decls才能获得where语法。declsdecl的序列:

decls &rightarrow; { decl1; ...; decln}

decl又有两个可能的规则:

德克利阿特罗; 根德克尔
        |(funlhs | pat) rhs

因此,这意味着我们可以在where子句的左侧声明模式(pat)。实际上在where a = 1中,可以说a已经是一种模式。该模式由一个变量组成。但是构造函数、别名运算符等都可以在where子句的左侧使用。

模式可以是变量、泛型构造函数、限定构造函数、文字、通配符、列表模式、元组模式、无可辩驳的模式等。然后可以在这里找到模式的完整语法。简而言之,它的工作方式类似于函数头部的模式匹配。

最新更新