Haskell 中的 '[] 和 ': 是什么?
What is '[] and ': in Haskell?
我在几个地方看到过这种 '[]
和 ':
语法,最明显的是在 HList or HVect.
这样的异构列表包中
例如异构向量HVect
定义为
data HVect (ts :: [*]) where
HNil :: HVect '[]
(:&:) :: !t -> !(HVect ts) -> HVect (t ': ts)
在 GHCi 中,扩展名 TemplateHaskell
或 DataKinds
,我得到这个
> :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。
搜索引擎和 hoogle, and hayoo 处理带有 '[]
或 ':
的查询相当糟糕,因此问题是:这些 '[]
和 ':
东西? 最欢迎指向文档或教程的指针。
DataKinds
允许在类型级别使用术语级别的构造函数。
之后
data T = A | B | C
可以编写由 T
值索引的类型
data U (t :: T) = ...
foo :: U A -> U B -> ...
然而,这里 A
和 B
用作类型,而不是值。因此,他们必须 "promoted" 使用引号:
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"
请注意最后两种情况,引号消除了语法歧义。
这本书
思考类型,桑迪·马奎尔 (http://thinkingwithtypes.com)
总体上可能是 Haskell 类型级编程主题的良好资源。
"Lifting Restrictions" 章涉及 DataKinds
和提升的构造函数。
(免责声明:无隶属关系。)
我在几个地方看到过这种 '[]
和 ':
语法,最明显的是在 HList or HVect.
例如异构向量HVect
定义为
data HVect (ts :: [*]) where
HNil :: HVect '[]
(:&:) :: !t -> !(HVect ts) -> HVect (t ': ts)
在 GHCi 中,扩展名 TemplateHaskell
或 DataKinds
,我得到这个
> :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。
搜索引擎和 hoogle, and hayoo 处理带有 '[]
或 ':
的查询相当糟糕,因此问题是:这些 '[]
和 ':
东西? 最欢迎指向文档或教程的指针。
DataKinds
允许在类型级别使用术语级别的构造函数。
之后
data T = A | B | C
可以编写由 T
data U (t :: T) = ...
foo :: U A -> U B -> ...
然而,这里 A
和 B
用作类型,而不是值。因此,他们必须 "promoted" 使用引号:
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"
请注意最后两种情况,引号消除了语法歧义。
这本书
思考类型,桑迪·马奎尔 (http://thinkingwithtypes.com)
总体上可能是 Haskell 类型级编程主题的良好资源。
"Lifting Restrictions" 章涉及 DataKinds
和提升的构造函数。
(免责声明:无隶属关系。)