什么是Haskell语法(类型级别运算符?)

时间:2015-08-03 12:05:48

标签: haskell syntax type-level-computation

Haskell代码中'[]':表示什么?一些例子 -

Example 1:

data OrderPacket replies where
  NoOrders :: OrderPacket '[]

Example 2:

data Elem :: [a] -> a -> * where
  EZ :: Elem (x ': xs) x

1 个答案:

答案 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])