我刚刚在一段Haskell代码中遇到了以下语法 -
data A = A Int Int | B
m :: A -> Int
m a = case a of
A{} -> 1
_ -> 2
A{}
在这做什么? {}
是否会自动匹配任意数量的参数?
我有一种感觉,这是在利用Haskell记录语法对一堆函数和常规代数数据类型的假设。是这样的吗?
答案 0 :(得分:28)
是的,A{}
匹配使用A
构造函数构造的任何值,无论该类型是否已使用记录语法声明。
表达式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′ }