我正在尝试使用HList,我需要对其进行注释,但我无法弄清楚如何去做。
如果在ghci中键入以下内容
>:t "hello" .*. HNil
我有以下类型签名:
HList((':) * [Char]('[] *))
我真的不明白。如果尝试使用此签名,我收到错误
“你好”。*。 HNil :: HList((':) * [Char]('[] *))
我收到了错误
<interactive>:21:15: parse error on input `:'
我该怎么办?
(我看过使用:*:
的内容,所以我理论上可以做String :*: HNil
但找不到:*:
。
答案 0 :(得分:5)
在旧版本的ghc中打印某些类型签名的方式非常糟糕。类型HList ((':) * [Char] ('[] *))
实际上意味着HList ( ([Char] :: *) ': ('[] :: *) )
。但这可能也不是很清楚,所以让我们来看看:
[Char] :: *
一个char列表,其kind(类型的类型)是*
,它是具有值的东西。此类型来自"hello"
'[] :: *
表示空类型级别列表的类型。编译器打印的类型实际上是错误 - '[]
的类型不是*
,而是[*]
- 与您a
的方式相同1}}和[a]
与:
。此类型来自HNil
。
':
等效于:
,但适用于类型级别列表。这来自.*.
您无法返回类型签名,因为它很简单无效。但是以下任何一种都是正确的:
"hello" .*. HNil :: HList ([Char] ': '[])
"hello" .*. HNil :: HList ( ([Char] :: *) ': ('[] :: [*]))
"hello" .*. HNil :: HList '[ String ]
"hello" .*. HNil :: HList '[ (String :: *) ]
你无法编写类型级别列表cons前缀 - 我认为这是解析器中的错误:
>"hello" .*. HNil :: HList ( (':) String '[])
<interactive>:4:31: parse error on input `:'
显式的注释是不必要的,但您可以将它们放入其中。
印刷在ghc 7.8中有所改进:
>:t "hello" .*. HNil
"hello" .*. HNil :: HList '[[Char]]