[英]Why does the following type constructor take less arguments than the data constructor?
我有以下類型聲明:
data Quadruple a b = Quad a a b b
(你們中的一些人可能會認識到另一個Haskell教程中的這個聲明)。
我理解代碼的意圖: 創建一個名為Quadruple的數據類型。 它有一個名為Quad的單一類型構造函數,它帶有四個值。 前兩個值必須具有相同的類型,並且后兩個值必須具有相同的類型。
我無法向自己解釋為什么類型構造函數的參數少於數據構造函數。 我能想到的唯一解釋是Haskell能夠從類型聲明中推斷出,如果第一個值是a類型,那么第二個值也是如此,如果第三個值是b類型,那么第四個值也是如此。
這個對嗎? 我在這里錯過了什么嗎? 我知道Haskell有類型推斷所以這是有道理的,但我不想用錯誤的心理模型運行。 (第二次嘗試學習Haskell)。
使用該類型可能更清楚
q = Quad 1 2 "peter" "paul"
在這里你可以看到有兩種類型, Int
和String
。 所以q
是Quadruple Int String
類型。
因此有兩種類型: Quadruple
的類型參數數量。 值構造函數需要4個值(/ fields): Quad
值構造函數的參數個數。
它就像函數一樣,每個形式參數可以多次使用,比如sqr x = x * x
。
同樣在這里: Quadruple
是一個類型構造函數:當給定兩個參數類型a
和b
時,它構造一個新類型。 所以Quadruple Int Double
是一種類型; Quadruple Int Int
是另一種類型。
它的價值是如何創造的? 通過使用具有四個參數值的數據構造函數Quad
:一對具有一種類型,另一對具有另一種類型。 這就是你告訴Haskell的定義。 所以是的,它會在推斷和檢查類型時使用這些知識。
我認為你是對的 - 左側只聲明可以在右側使用的類型變量1 。
所以以下所有內容都是有效的:
data A = A Int
在RHS上沒有LHS => none的變量
data B b = B1 Int | B2 b
在LHS上有一個變量,並在RHS的一個構造函數中使用它; 請注意,您根本不需要使用變量 - 這稱為幻像類型。
data C c = C Int
這還是有用的東西。
1 :除了存在類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.