2016-08-17 86 views
3

在Haskell中,使用雙冒號鍵入聲明,即(::),如not :: Bool -> BoolHaskell和Haskell類語言之間的類型聲明語法區別

但是在許多其語言與Haskell相似的語言中,例如,榆樹,阿格達, 他們使用單個冒號(:)來聲明類型。像not : Bool -> Bool

爲什麼這些語言放棄了haskell樣式類型聲明語法。

  • 是(:)比(::)更好地聲明一個類型?
  • 還是(::)更適合其他用途?
  • 還是因爲(:)是一個小於(::)的字符?
+1

FWIW,我認爲'::'實際上在頂層簽名中更好地閱讀,因爲它在值級別和類型級別之間帶來更多空間。 'not:Bool - > Bool'看起來有點像它應該被解析的'(不是:Bool) - > Bool'。但許多現有的中綴操作員都有很多相同的問題;我想這基本上只是你常用的東西。 – leftaroundabout

+0

如果你假裝一個類型註釋是一個實際值,'::'是有道理的。它與任何其他中綴構造函數一樣以':'開頭,它在類型註釋的「真實」符號之前,並給出一個名稱和一個類型作爲參數,它返回一個類型註釋。 – chepner

回答

9

聽說SPJ說,某個地方,這是一個爭論的問題,選擇:::之間 。他和約翰·休斯最終以::結算。從 的A History of Haskell: Being Lazy With Class紙:

我們從米蘭達採用的慣例,數據構造是 資本,而變量都沒有,並且加入了類似的規定 中綴構造,這在Haskell必須以一個冒號開始。爲了與我們的使用(來自SASL,KRC和Miranda的採用 )一致,我們選擇了後面的約定:對於列表「cons」 運算符。 (該選擇「:」類型 簽名利弊和「::」,順便說一下,是一個爭論激烈的話題(ML是否 對面),並仍然是有爭議的這一天。)

+0

我不認爲這是SPJ和約翰休斯誰決定這一點。最初是Phil Wadler的設計(模仿Miranda和Orwell),然後Haskell委員會保留它。這是一個不幸的選擇。 – augustss

+0

是的,我認爲這是在SPJ和Wadler之間。我可能會嘗試在週末之前鏈接視頻。 – Sibi

10

IIRC Haskell選擇使用::是一個(不幸的)歷史事故。 Haskell基本上基於Miranda,其還使用::作爲類型。米蘭達的作者真的希望利弊運營商是:,因爲他們認爲它會更普遍使用,所以鍵入操作員必須被授權到::

它確實沒有被證明是一個好主意,因爲否則所有關於類型的文獻(甚至是談論Haskell)都使用:。作爲最接近的paper at hand,雙冒號用於所有樣本(Haskell)代碼,但數學判斷(如第10頁)均遵循傳統單冒號。


我想我記得聽到的地方(編輯:這是here,但我懶得聽整個事情得到正確的時間),在當時,很多計劃生育研究人員只是想非常清楚地界定米蘭達,以便研究論文談論懶惰功能純語言可以有一個共同的語言來談論他們的想法。米蘭達的設計師不希望這樣做,而是表示如果用與米蘭達非常相似的另一種語言(爲了雙方的利益而提供的,這兩種語言仍然可以區分),他們會沒事的。 。這是Haskell委員會的起點。

+3

我不會稱之爲_that_不幸。顛倒它們可能會更好一些,但是Haskell符號與通用數學符號略有不同(這在許多其他地方都是這種情況)。 – Cubic

+0

你的腳註不完全準確。 – augustss