Haskell 这是语法如何工作的?
我在GitHub上研究这个解决方案,以解决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
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
子句的工作原理与函数头部的模式匹配系统的工作原理类似。