这个语法在哪里工作?

时间:2017-06-11 13:50:36

标签: 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) = integerToNat $ i-1

我很困惑

  

其中(Just x)= integerToNat $ i-1

我以为我只能将表达式分配给where中的标识符。但看起来(Just x)解包了已分配的表达式的值并将x分配回(Succ x)

有人可以解释为什么会这样吗?

1 个答案:

答案 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。因此,简而言之,它就像函数头部的模式匹配一​​样。