这是什么haskell语法?
我只是在一段Haskell代码中遇到了以下语法-这是什么haskell语法?,haskell,syntax,record,Haskell,Syntax,Record,我只是在一段Haskell代码中遇到了以下语法- data A = A Int Int | B m :: A -> Int m a = case a of A{} -> 1 _ -> 2 A{}在这里做什么?{}是否自动匹配任意数量的参数 我觉得这是在利用Haskell将语法desugars记录到一组函数和一个常规代数数据类型这一事实。是这样吗?是,A{}匹配使用A构造函数构造的任何值,无论该类型是否已使用记录语法声明 指定 表达式F{},其中F是数据构造函数,无论
data A = A Int Int | B
m :: A -> Int
m a = case a of
A{} -> 1
_ -> 2
A{}
在这里做什么?{}
是否自动匹配任意数量的参数
我觉得这是在利用Haskell将语法desugars记录到一组函数和一个常规代数数据类型这一事实。是这样吗?是,
A{}
匹配使用A
构造函数构造的任何值,无论该类型是否已使用记录语法声明
指定
表达式F{},其中F是数据构造函数,无论F是否使用记录语法声明,都是合法的(前提是F没有严格的字段,请参见上面的第四个项目符号);它表示F⊥1 … ⊥n、 其中n是F的算术数
括号中提到的“第四个项目符号”指出,使用记录语法构造值是一个静态错误,它省略了一个严格的字段
在上一节中,模式的语法规则之一是
apat -> qcon { fpat1 , … , fpatk } (labeled pattern, k ≥ 0)
模式匹配的形式语义小节(3.17.3)给出了语义,如下所示:
每天学习新的东西,我已经为Haskell编程5年了;我一生中从未见过这种语法。这种语法很有用,因为即使构造函数
A
的参数数量改变,函数定义也不需要改变。对于规则模式匹配(例如,A->…
),情况并非如此。@Daniel-但在这种情况下,我们谈论的不是表达式,而是模式。我认为F{}
应该等同于F\u 1\u 2_n
其中n是构造函数的算术。@Ingo Right。昨晚只看了“非正式语义”部分,没有发现任何东西,但表达部分很突出。在几个小时的睡眠后,在正式语义部分找到了它。@DanBurton我不认为它只是关于可能改变的参数数量。我之所以使用A{}
语法,是因为我发现读(A{uu{uu}
(很多情况下需要括号)的case分支更难读。这是关于不要写你不在乎的东西,所以很明显你不在乎它们。
(o) case v of { K {} -> e ; _ -> e′ }
= case v of {
K _… _ -> e ; _ -> e′ }