2017-09-14 188 views
4

Haskell類型簽名中的兩種類型「a」和「t」之間是否存在任何差別,或者它只有類型「a」和類型「b」的不同名稱?Haskell類型簽名中類型「a」和類型「t」之間的區別是什麼?

https://www.haskell.org/tutorial/goodies.html類型並[a]

被定義爲如下:

並[a]是組成的類型的家庭,對於每個類型,的列表的 類型。整數列表(例如[1,2,3]),字符列表 (['a','b','c']),甚至整數列表等等,都是 這個成員家庭。 (注意,然而,[2,「B」]是不是一個有效 例子中,由於有一個包含兩個2和「b」沒有單一的類型。)

是該定義也適用於類型爲「 t「?

的例子可能是:

foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b 
    app :: [t] -> t -> [t] 
+1

這取決於簽名中是否存在與這些符號匹配的類型限制。顯示有問題的簽名。 – Carcigenicate

+3

不,如果類型變量不在類型約束中出現,這些只是變量。這些變量的名稱是任意的。但有時候更多的語義名稱可能會有用。像數字的'n'等 –

+3

不是一個完整的答案,但它可能有助於知道'foldl :: Foldable t =>(b - > a - > b) - > b - > ta - > b'是等價的到'foldl :: Foldable x =>(y - > z - > y) - > y - > xz - > y'和'app :: [t] - > t - > [t]'相當於'app :: [u] - > u - > [u]' – TobiMcNamobi

回答

2

在Haskell類型定義,類型名總是以大寫字母開頭,而類型的變量總是以小寫字母開頭。這些通常稱爲a,b等,但也可以稱爲f,m,t等。

通常情況下,在字母的開頭字母被用於無限制類型的變量,而你經常看到fmt表示更具體的類型的變量,依此類推。

在特定示例

foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b 

t具體表示爲是Foldable類型的類的一個實例。 t a表示容納a類型值的任何「容器」Foldable

當你看到你的其他例子

app :: [t] -> t -> [t] 

還不如說[a] -> a -> [a],如果app是「自立」的功能。另一方面,如果app屬於一個類型類,則該類型類定義可以包含更具體的t定義。

相關問題