这个haskell语法是什么?

时间:2012-01-18 04:26:33

标签: haskell syntax record

我刚刚在一段Haskell代码中遇到了以下语法 -

data A = A Int Int | B

m :: A -> Int
m a = case a of
  A{} -> 1
  _ -> 2

A{}在这做什么? {}是否会自动匹配任意数量的参数?

我有一种感觉,这是在利用Haskell记录语法对一堆函数和常规代数数据类型的假设。是这样的吗?

1 个答案:

答案 0 :(得分:28)

是的,A{}匹配使用A构造函数构造的任何值,无论该类型是否已使用记录语法声明。

language report指定

  

表达式F {},其中F是数据构造函数,无论是否使用记录语法声明F(如果F没有严格的字段,请参见上面的第四个子弹)是合法的;它表示F⊥1...⊥n,其中n是F的arity。

括号中提到的“第四个项目符号”指出,使用记录语法构造一个省略严格字段的​​值是一个静态错误。

pattern matching的部分中,模式的一个语法规则是

apat -> qcon { fpat1 , … , fpatk }      (labeled pattern, k ≥ 0)

和语义在关于模式匹配(3.17.3)的形式语义的小节中给出

(o) case  v  of {  K  {} ->  e ; _ ->  e′ }
        = case  v  of {
            K _… _ ->  e ; _ ->  e′ }