我明白以下幾種:種類水平的圓括號是什麼意思?
String :: *
[] :: * -> *
(->) :: * -> * -> *
(,) :: * -> * -> *
但什麼是這種意思,可能它代表什麼類型?
? :: (* -> *) -> *
我明白以下幾種:種類水平的圓括號是什麼意思?
String :: *
[] :: * -> *
(->) :: * -> * -> *
(,) :: * -> * -> *
但什麼是這種意思,可能它代表什麼類型?
? :: (* -> *) -> *
? :: (* -> *) -> *
意味着,如果你給?
什麼樣的* -> *
,你會得到一個類型(一種*
東西)。我們來舉一個具體的例子:
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 :: * -> *
以類型構造函數作爲參數的更高版本的類型。現在對我來說很明顯。在我的辯護中,我只能說像'(* - > *) - > *'這樣的註釋具有相當高的抽象層次。謝謝! – ftor
這裏是一個人爲的例子:'數據IntContainer F = IC(F智力)'。然後,我可以得到'IC [1,2,3]'或'IC(Data.Set.fromList [1,2,3])'的值。請注意'IntContainer ::(* - > *) - > *'。 – Alec
通過它作爲第一個參數 –
@WillemVanOnsem:'* - > *'不是一個更高的類型。 '(* - > *) - > *'是 - 就像高階函數將函數作爲參數一樣,高階類型將類型構造函數作爲參數。 –