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
A
、B
和C
被称为数据构造函数;有时作为值构造函数。但是正确的名称是什么:
-
“行/替代”:例如
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”?的主要内容,如果未能解决你的问题,请参考以下文章