ADT 名称。在 Haskell 中,啥是“Left a”,那么啥是“a”?

Posted

技术标签:

【中文标题】ADT 名称。在 Haskell 中,啥是“Left a”,那么啥是“a”?【英文标题】:ADT names. What is `Left a`, and then what is `a`, in Haskell?ADT 名称。在 Haskell 中,什么是“Left a”,那么什么是“a”? 【发布时间】:2011-12-19 15:34:13 【问题描述】:

如果我有 Haskell ADT,例如:

data Foo
 = A Int Double
 | B Bool [Integer]
 | C (Maybe String) Float

ABC 被称为数据构造函数;有时作为值构造函数。但是正确的名称是什么:

    “行/替代”:例如B Bool [Integer];和 “行/替代”的“字段/元素”:例如Double 中的 A,或 [Integer] 中的 B?

【问题讨论】:

我认为您会将B : Bool -> [Integer] -> Foo 描述为构造函数及其类型。 Bool[Integer] 将是它的论点,例如[Integer] 将是单个参数或参数。但我不确定这些是否是普遍接受的名称。 据我所知,“字段”是正确的术语。 “参数”或“参数”仅在实际构造时使用。 我想我通常不觉得有必要参考这些东西。通常引用“构造函数 C”或“类型 Foo”就足够了。您是否有一个示例填空句子,您希望在其中引用这些内容? (也许回答者会接受在句子中有意义地使用这些术语的挑战。) 【参考方案1】:

从 Haskell98 报告 (http://www.haskell.org/onlinereport/decls.html) 中阅读第 4.2 节:

    没有明确说明,但 B Bool [Integer] 可能最正确地称为“构造函数声明”(对于名为 B 的构造函数) 像A 中的Double 这样的东西称为字段声明(尽管简单地称它为字段也应该可以)。

【讨论】:

谢谢苏木杜。看那里只能看到“构造函数定义”,在Haskell 2010 report - Section 4.2中也是一样。至于“字段”,它看起来在特别讨论记录语法时使用;它是“标记字段”或“字段标签”。 “组件”在同一页面上使用,我认为它可能是正确的。 很公平。我从语法规范中使用的名称“fielddecl”推断“字段声明”。似乎没有一个完全确定的名称(IMO 当他们使用“组件”时,它更多的是描述而不是实际命名)。 我同意,这更像是描述。顺便说一句,语法规范中的“fielddecl”也仅指记录语法。【参考方案2】:
data Foo = A Int Double
     ^^ Type Constructor "data Foo"
           ^ value Constructor "A"
             ^^ Component "Int" and "Double"

一个 | B通常被称为替代品或案例。对不起,糟糕的图表。

Source: Real World Haskell ch3

【讨论】:

Haskell 报告也使用了“组件”,所以这看起来适合第二季度。我还在那里看到了“构造函数定义”,这似乎适合 Q1。

以上是关于ADT 名称。在 Haskell 中,啥是“Left a”,那么啥是“a”?的主要内容,如果未能解决你的问题,请参考以下文章

在 Haskell 中推导是如何工作的?

Algebraic Data Type 及其在 Haskell 和 Scala 中的表现

Haskell 中 (>>) 运算符的正确名称是啥?

LEF 格式

如何查找Haskell名称的包,版本和文档

在 C++ 中,啥是“命名空间别名”?