2015-08-03 49 views

回答

9

從哈斯克爾用戶指南節上Promoted list and tuple lists

隨着-XDataKinds,Haskell的列表和元組類型本身提升 種類,和恩爲Y型的水平不變方便的語法, 雖然前綴報價:

data HList :: [*] -> * where 
    HNil :: HList '[] 
    HCons :: a -> HList t -> HList (a ': t) 

data Tuple :: (*,*) -> * where 
    Tuple :: a -> b -> Tuple '(a,b) 

foo0 :: HList '[] 
foo0 = HNil 

foo1 :: HList '[Int] 
foo1 = HCons (3::Int) HNil 

foo2 :: HList [Int, Bool] 
foo2 = ... 

(注:HCons聲明還要求,因爲 綴類型的操作-XTypeOperators(:'))。對於類型 - 兩個或多個 元素的級別列表,例如上面的foo2的簽名,由於含義是明確的,因此可能會省略 。但對於一個或 零元素列表(如foo0和foo1中),引號是必需的,因爲 類型[]和[Int]在Haskell中具有現有含義。

所以基本上它是一個以單引號爲前綴的語法,但它在類別層次上運行。一些playup使用ghci與上面的代碼:

λ> :t HNil 
HNil :: HList '[] 
λ> :t HCons 
HCons :: a -> HList t -> HList (a : t) 
λ> let x = 3 `HCons` HNil 
λ> :t x 
x :: Num a => HList '[a] 
λ> let x = Tuple 3 "spj" 
λ> :t x 
x :: Num a => Tuple '(a, [Char]) 
+0

完美!謝謝! –

+0

完美(對於我需要的ghci::set -XDataKinds -XTypeOperators -XKindSignatures -XGADTs)。當然,數據種類! –

+1

!該死的,我花了很多年試圖弄清楚這一點...... – MathematicalOrchid

相關問題