9

如果我有一个Haskell ADT如:ADT名称。在Haskell中,什么是“留下了”,然后是什么“a”?

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

AB,和C被称为数据构造;有时可以看作价值构造函数。但是什么是正确的名称:

  1. “行/备选”:例如, B Bool [Integer];和“行/备选”的“字段/元素”:例如, Double in A[Integer] in B
+1

我想你会形容'B:BOOL - > [整数] - > Foo'的构造和类型。 'Bool'和'[Integer]'是它的论点,例如'[Integer]'是单个参数或参数。但我不确定这些是否是普遍接受的名称。 – nobody

+0

从我所看到的,“领域”是正确的术语。 “参数”或“参数”仅在实际构建*时使用。 – Nate

+0

我想我通常不会觉得有必要提及这些东西。引用“构造函数C”或“类型Foo”通常就足够了。你有没有想要参考这些东西的例子填空句子? (也许回答者会接受在句子中有意义地使用这些术语的挑战。) –

回答

3
data Foo = A Int Double 
    ^^ Type Constructor "data Foo" 
     ^value Constructor "A" 
      ^^ Component "Int" and "Double" 

A | B通常被称为替代品或案例。对不起,蹩脚的图。

Source: Real World Haskell ch3

+0

Haskell报告也使用“组件”,所以这看起来适合Q2。我也看到了“构造函数定义”,这对第一季来说似乎是正确的。 – user2023370

11

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

  1. 这是没有说出来明确,但B Bool [Integer]可能是最正确称为“构造函数声明”(名为B构造函数)
  2. DoubleA这样的东西被称为字段声明(尽管简单地称它为字段也应该是OK)。
+0

谢谢Sumudu。在那里,我只能看到“构造函数定义”,在[Haskell 2010报告 - 4.2节](http://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-680004.2)中也是如此。至于“领域”,它看起来像* *仅用于特别讨论记录语法;在那里它可以是“标签字段”或“字段标签”。 “组件”在同一页面上使用,我认为它可能是正确的。 – user2023370

+0

够公平的。我从语法规范中使用的名称“fielddecl”中推断“字段声明”。似乎没有一个完全确定的名称(国际海事组织在使用“组件”时,更多的是描述而不是实际命名它)。 –

+0

我同意,它更像是一个描述。顺便说一下,语法规范中的“fielddecl”也仅指记录语法。 – user2023370