2015-08-03 48 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

相关问题