2

我正在尝试使用 HList,我需要对其进行注释,但我不知道该怎么做。

如果如果在 ghci 中键入以下内容

>:t "hello" .*. HNil

我得到以下类型签名:

HList ((':) * [字符] ('[] *))

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

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

我有一个错误

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

我应该怎么办 ?

(我已经看到使用的东西,:*:所以理论上我可以这样做,String :*: HNil但它找不到:*:.

4

1 回答 1

5

在旧版本的 ghc 中打印某些类型签名的方式非常糟糕。类型HList ((':) * [Char] ('[] *))真的意味着HList ( ([Char] :: *) ': ('[] :: *) )。但这可能也不是很清楚,所以让我们来看看:

  • [Char] :: * char 列表,其种类(类型的类型)是*,这是具有值的事物的种类。这种类型来自于"hello"

  • '[] :: *表示空类型级别列表的类型。编译器打印的类型实际上是错误的 -'[]不是*,它是[*]- 与您 consa[a]with的方式相同:。这种类型来自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]]
于 2014-05-18T17:44:55.747 回答