【问题标题】:What is this haskell syntax?这是什么haskell语法?
【发布时间】:2012-02-12 21:06:56
【问题描述】:

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

data A = A Int Int | B

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

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

我有一种感觉,这是利用 Haskell 记录语法脱糖到一堆函数和常规代数数据类型这一事实。是这样吗?

【问题讨论】:

  • 每天学习新东西,我已经编写 Haskell 5 年了;我一生中从未见过这种语法。

标签: haskell syntax record


【解决方案1】:

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

language report 指定

表达式 F {},其中 F 是一个数据构造函数,无论 F 是否使用记录语法声明都是合法的(前提是 F 没有严格的字段——参见上面的第四个项目符号);它表示 F ⊥1 … ⊥n,其中 n 是 F 的元数。

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

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′ }

【讨论】:

  • 这种语法很有用,因为即使构造函数A 的参数数量改变,函数定义也不需要改变。对于常规模式匹配(例如A _ _ -> ...),情况并非如此。
  • @Daniel - 但在这种情况下,我们说的不是表达式,而是模式。我认为F{} 应该等同于F _1 _2 ... _n,其中 n 是构造函数的数量。
  • @Ingo 对。昨晚只看了'informal semantics'部分,没发现什么,但是表情部分很突出。睡了几个小时后在形式语义部分找到了。
  • @DanBurton 我认为这不仅仅是可能改变的参数数量。我使用A{} 语法只是因为我发现一个读取(A _ _ _ _ _) 的case 分支(在很多情况下需要括号)更难阅读。这是关于不写你不关心的东西,所以很明显你不关心它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2010-12-13
  • 2022-10-08
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2013-06-23
相关资源
最近更新 更多