你如何在HList中注释类型

时间:2014-05-18 17:27:42

标签: haskell hlist

我正在尝试使用HList,我需要对其进行注释,但我无法弄清楚如何去做。

如果在ghci中键入以下内容

>:t "hello" .*. HNil

我有以下类型签名:

HList((':) * [Char]('[] *))

我真的不明白。如果尝试使用此签名,我收到错误

  

“你好”。*。 HNil :: HList((':) * [Char]('[] *))

我收到了错误

<interactive>:21:15: parse error on input `:'

我该怎么办?

(我看过使用:*:的内容,所以我理论上可以做String :*: HNil但找不到:*:

1 个答案:

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