Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是什么haskell语法?_Haskell_Syntax_Record - Fatal编程技术网

这是什么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是数据构造函数,无论

我只是在一段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是数据构造函数,无论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′ }