【问题标题】:how do you annotate type in HList你如何在 HList 中注释类型
【发布时间】:2014-05-19 01:44:55
【问题描述】:

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

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

>:t "hello" .*. HNil

我得到了以下类型签名:

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

我不太明白。如果尝试使用此签名,则会出现错误

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

我遇到了一个错误

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

我该怎么办?

(我见过使用:*: 的东西,所以理论上我可以使用String :*: HNil,但找不到:*:

【问题讨论】:

  • :*: 在 HList 0.3 中被删除,因为 ': 几乎是一回事。

标签: haskell hlist


【解决方案1】:

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

  • [Char] :: * 一个char列表,​​其kind(类型的类型)为*,是有值的东西。这个类型来自"hello"的类型

  • '[] :: * 表示空类型级别列表的类型。编译器打印的类型实际上是错误 - '[] 的类型不是 *,而是 [*] - 与您使用 a[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]]

【讨论】:

  • 那行得通。但是它需要DataKinds 扩展。
  • "hello" .*. HNil :: HList ( '(:) String '[]) 有效。不过,我不确定(':) 不起作用的充分理由。
猜你喜欢
  • 2011-04-23
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 2012-10-02
  • 1970-01-01
  • 2018-08-01
相关资源
最近更新 更多