这个haskell语法是什么?

Anu*_*ain 28 syntax haskell record

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

data A = A Int Int | B

m :: A -> Int
m a = case a of
  A{} -> 1
  _ -> 2
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*her 28

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

语言报告指定

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

括号中提到的"第四个项目符号"表明,使用记录语法构造一个省略严格字段的​​值是一个静态错误.

在关于模式匹配的部分中,模式的语法规则之一是

apat -> qcon { fpat1 , … , fpatk }      (labeled pattern, k ? 0)
Run Code Online (Sandbox Code Playgroud)

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

(o) case  v  of {  K  {} ->  e ; _ ->  e? }
        = case  v  of {
            K _… _ ->  e ; _ ->  e? }
Run Code Online (Sandbox Code Playgroud)

  • 这种语法很有用,因为即使构造函数"A"的参数个数发生变化,函数定义也不需要改变.使用常规模式匹配(例如`A _ _ - > ...`),情况并非如此. (3认同)
  • @DanBurton我不认为这可能会改变一些论点.我使用`A {}`语法只是因为我发现一个案例分支读取`(A _ _ _ _ _)`(有许多情况需要括号)更难以阅读.这是关于不写你不关心的东西,所以很明显你不关心它们. (3认同)