gpt4 book ai didi

haskell - 如何在 HList 中注释类型

转载 作者:行者123 更新时间:2023-12-01 22:24:38 26 4
gpt4 key购买 nike

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

如果在 ghci 中输入以下内容

>:t "hello" .*. HNil

我得到了以下类型签名:

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

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

"hello" .*. HNil :: HList ((':) * [Char] ('[] *))

我收到一个错误

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

我应该做什么?

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

最佳答案

旧版本的 ghc 中某些类型签名的打印方式非常糟糕。类型 HList ((':) * [Char] ('[] *)) 的真正含义是 HList ( ([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]]

关于haskell - 如何在 HList 中注释类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23724823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com