这个 haskell 语法是什么?

发布于 2024-12-27 22:32:46 字数 268 浏览 1 评论 0原文

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

data A = A Int Int | B

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

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

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

I just ran across the following syntax in a piece of Haskell code -

data A = A Int Int | B

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

What is the A{} doing here? Does the {} automatically match for any number of arguments?

I have a feeling that this is exploiting the fact that Haskell record syntax desugars to a bunch of functions and a regular Algebraic Datatype. Is that the case?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你的背包 2025-01-03 22:32:46

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

语言报告指定

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

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

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

apat -> qcon { fpat1 , … , fpatk }      (labeled pattern, k ≥ 0)

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

(o) case  v  of {  K  {} ->  e ; _ ->  e′ }
        = case  v  of {
            K _… _ ->  e ; _ ->  e′ }

Yes, A{} matches any value constructed with the A constructor, regardless of whether the type has been declared with record syntax or not.

The language report specifies

The expression F {}, where F is a data constructor, is legal whether or not F was declared with record syntax (provided F has no strict fields — see the fourth bullet above); it denotes F ⊥1 … ⊥n, where n is the arity of F.

The 'fourth bullet' mentioned in the parenthesis states that it is a static error to construct a value with record syntax which omits a strict field.

And in the section on pattern matching, one of the grammar rules for patterns is

apat -> qcon { fpat1 , … , fpatk }      (labeled pattern, k ≥ 0)

and the semantics are given in the subsection on formal semantics of pattern-matching (3.17.3) as

(o) case  v  of {  K  {} ->  e ; _ ->  e′ }
        = case  v  of {
            K _… _ ->  e ; _ ->  e′ }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文