2017-09-27 72 views
2

我明白以下幾種:種類水平的圓括號是什麼意思?

String :: * 
[] :: * -> * 
(->) :: * -> * -> * 
(,) :: * -> * -> * 

但什麼是這種意思,可能它代表什麼類型?

? :: (* -> *) -> * 
+2

這裏是一個人爲的例子:'數據IntContainer F = IC(F智力)'。然後,我可以得到'IC [1,2,3]'或'IC(Data.Set.fromList [1,2,3])'的值。請注意'IntContainer ::(* - > *) - > *'。 – Alec

+0

通過它作爲第一個參數 –

+2

@WillemVanOnsem:'* - > *'不是一個更高的類型。 '(* - > *) - > *'是 - 就像高階函數將函數作爲參數一樣,高階類型將類型構造函數作爲參數。 –

回答

3

? :: (* -> *) -> *意味着,如果你給?什麼樣的* -> *,你會得到一個類型(一種*東西)。我們來舉一個具體的例子:

newtype IntContainer f = IC { getContainer :: f Int } 

這意味着包含Int s。我可以用IntContainer作爲基礎數據結構,列出或設置任何我想要的(類型* -> *)。事情是f不是這裏的一個類型 - 它是一個類型之前需要應用另一個類型。所以:IntContainer需要應用一些東西,而這又需要應用一個類型。

ghci> :kind IntContainer 
IntContainer :: (* -> *) -> * 

我可以通過施加的樣* -> *事情IntContainer使混凝土類型:

ghci> ic1 = IC [1,2,3] 
ic1 :: IntContainer []       -- [] :: * -> * 
ghci> ic2 = IC (Data.Set.fromList [1,2,3]) 
ic2 :: IntContainer Set       -- Set :: * -> * 
ghci> ic3 = IC (Data.Sequence.fromList [1,2,3]) 
ic3 :: IntContainer Seq       -- Seq :: * -> * 
+0

以類型構造函數作爲參數的更高版本的類型。現在對我來說很明顯。在我的辯護中,我只能說像'(* - > *) - > *'這樣的註釋具有相當高的抽象層次。謝謝! – ftor

相關問題