簡體   English   中英

為什么以下類型構造函數的參數少於數據構造函數?

[英]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"

在這里你可以看到有兩種類型, IntString 所以qQuadruple Int String類型。

因此有兩種類型: Quadruple的類型參數數量。 值構造函數需要4個值(/ fields): Quad值構造函數的參數個數。

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

同樣在這里: Quadruple是一個類型構造函數:當給定兩個參數類型ab時,它構造一個新類型。 所以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM