Haskell中的'[]和':是什么?

时间:2019-01-03 10:21:39

标签: haskell data-kinds heterogeneous-array

我在一些地方见过这种'[]':语法,最值得注意的是在HListHVect之类的异构列表包中。

例如,异构向量HVect被定义为

data HVect (ts :: [*]) where
    HNil :: HVect '[]
    (:&:) :: !t -> !(HVect ts) -> HVect (t ': ts)

在GHCi中,扩展名为TemplateHaskellDataKinds,我知道了

> :t '[]
'[] :: template-haskell-2.13.0.0:Language.Haskell.TH.Syntax.Name
> :t '(:)
'(:) :: template-haskell-2.13.0.0:Language.Haskell.TH.Syntax.Name

我的印象是,这与依赖类型和种类等有关,与模板haskell有关。

搜索引擎hooglehayoo处理'[]':的查询非常糟糕,因此出现了一个问题:……的名称是什么这些'[]':这些东西?非常欢迎指向文档或教程的指针。

2 个答案:

答案 0 :(得分:8)

DataKinds允许在类型级别使用术语级别的构造函数。

之后

data T = A | B | C

一个人可以编写索引值为T的类型

data U (t :: T) = ...
foo :: U A -> U B -> ...

但是,AB在这里用作类型,而不是值。因此,必须使用引号将其“升级”:

data U (t :: T) = ...
foo :: U 'A -> U 'B -> ...

熟悉的列表语法也会发生同样的情况。 '[]是一个空列表,在类型级别提升。 '[a,b,c]a ': b ': c ': '[]相同,后者是在类型级别提升的列表。

type           :: kind
'[]            :: [k]   -- polykinded! works for any kind k
'[ 'A, 'B, 'C] :: [T]   -- mind the spaces, we do not want the char '['
'A ': '[]      :: [T]
'[ Int, Bool ] :: [*]   -- a list of types
'[ Int ]       :: [*]   -- a list of types with only one element
[Int]          :: *     -- a type "list of Int"

请注意最后两种情况,其中引号会消除语法的歧义。

答案 1 :(得分:1)

这本书

Sandy Maguire(http://thinkingwithtypes.com)的

类型思维

通常,

可能是Haskell中有关类型级编程的好资源。 “解除限制”一章介绍DataKinds和升级的构造函数。

(免责声明:无从属关系。)