Haskell代码中'[]
或':
表示什么?一些例子 -
data OrderPacket replies where
NoOrders :: OrderPacket '[]
data Elem :: [a] -> a -> * where
EZ :: Elem (x ': xs) x
答案 0 :(得分:9)
来自Promoted list and tuple lists上的Haskell用户指南部分:
使用-XDataKinds,Haskell的列表和元组类型是本地推广的 种类,并在类型级别享受相同的方便语法, 虽然以引号为前缀:
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中具有现有含义。
所以基本上它是以单引号为前缀的相同语法,但它在类型级别上运行。使用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])