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