2017-02-26 71 views
2

我有以下類型聲明:爲什麼下面的類型構造函數比數據構造函數的參數少?

data Quadruple a b = Quad a a b b 

(有些人可能從承認這一宣言然而,另一個哈斯克爾教程)。

我明白代碼的意圖是:創建一個名爲Quadruple的數據類型。它有一個稱爲Quad的類型構造函數,它有四個值。前兩個值必須具有相同的類型,而最後兩個值必須具有相同的類型。

我無法向自己解釋爲什麼類型構造函數的參數比數據構造函數少。我可以想象的唯一解釋是Haskell能夠從類型聲明中推斷出,如果第一個值是a類型,那麼第二個值也是,如果第三個值是b類型,那麼第四個值也是如此。

這是正確的嗎?我在這裏錯過了什麼嗎?我知道Haskell有類型推斷,所以這是有道理的,但我不想用錯誤的心智模式運行。 (第二次嘗試學習Haskell)。

回答

8

這可能是使用類型

q = Quad 1 2 "peter" "paul" 

在這裏你可以看到有2種類型的遊戲,IntString清晰。所以q的類型是Quadruple Int String

所以有兩種類型參與:類型參數的數量Quadruple。並且值構造函數需要4個值(/字段):Quad值構造函數的參數個數。

5

就像功能一樣,每個形式參數可以多次使用,如sqr x = x * x

同樣在這裏:Quadruple是一個類型構造:提供兩個參數類型,ab當它構建了一個新的類型。所以Quadruple Int Double是一種類型; Quadruple Int Int是另一種類型。

如何創建它的?通過使用具有四個參數值的數據構造函數Quad:具有一個類型的對和具有另一個類型的另一個對。這就是告訴Haskell這個定義。所以是的,它會使用這些知識來推斷和檢查類型。

1

我認爲你是對的 - 左手邊只聲明可用於右手邊的類型變量。

所以下面所有的都是有效的:

data A = A Int 

沒有變量上的RHS

data B b = B1 Int | B2 b 

的LHS =>沒有對LHS一個變量和一個使用此它是RHS上的構造者;注意你根本不需要使用變量 - 這就是所謂的幻像類型。

data C c = C Int 

這仍然是有用的。

:除了存在類型

相關問題