Haskell 这是语法如何工作的?

Haskell 这是语法如何工作的?,haskell,syntax,Haskell,Syntax,我在GitHub上研究这个解决方案,以解决Haskell在《第一原则》一书中提出的一个问题。这是密码 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

我在GitHub上研究这个解决方案,以解决Haskell在《第一原则》一书中提出的一个问题。这是密码

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
数据Nat=
零
|成功Nat派生(均衡,显示)
integerToNat::Integer->Maybe Nat
整合素Ⅰ
|i<0=无
|i==0=仅为零
|i>0=刚好(成功x),其中(刚好x)=整数等于$i-1
我对这件事感到困惑

式中(仅x)=整数等于$i-1

我想我只能在
where
中为标识符分配一个表达式。但是它看起来像是
(仅x)
将表达式赋值的值解包,并将
x
赋值回
(Succ x)

有人能解释一下为什么这样做吗?

Haskell在函数的右侧(rhs)有一个条目:

右箭头和右箭头<代码>=exp[
where
decls]
|gdrhs[
其中
十二月]

这意味着我们必须查看
decls
以获得
where
语法
decl
是一系列的
decl
s:

decls和rightarrow;{decl1;…;decln}

decl
又有两个可能的规则:

decl&rightarrow;gendecl
|(funlhs | pat)rhs

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


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

为什么不呢?;)你基本上是对的,它可以打开rhs。这与用于函数定义的模式匹配机制相同,比如
natToInteger Zero=0;natToInteger(Succ x)=1+natToInteger x
。请记住,即使
中只有x=…
通过模式匹配定义了
x
,这可能是危险的:当需要
x
时,如果模式不匹配(例如,因为递归调用返回
无任何内容),将引发运行时错误,破坏了整个计划。当然,在这里它永远不会发生,但是程序员的责任是确保它。明白了。这意味着我可以写得更少,因为where支持构造函数匹配……感谢您的澄清。@NirvinM:yes,
where
子句的工作原理与函数头部的模式匹配系统的工作原理类似。