你如何在HList中注释类型

mb1*_*b14 2 haskell hlist

我正在尝试使用HList,我需要注释它,但我无法弄清楚如何做到这一点.

如果在ghci中键入以下内容

>:t "hello" .*. HNil
Run Code Online (Sandbox Code Playgroud)

我得到以下类型签名:

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

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

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

我收到了一个错误

<interactive>:21:15: parse error on input `:'
Run Code Online (Sandbox Code Playgroud)

我该怎么办 ?

(我已经看到了使用的东西,:*:所以我理论上可以做String :*: HNil但却无法找到:*:.

use*_*038 5

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

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

  • '[] :: *表示空类型级别列表的类型.编译器打印实际上是类型错误的 -那种'[]*,它是[*]-同样的方式,你利弊a,并[a]:.这种类型来自于HNil.

  • ':等效:但类型级别列表.这来自于它的类型.*.

您无法返回类型签名,因为它很简单无效.但是以下任何一种都是正确的:

"hello" .*. HNil :: HList ([Char] ': '[])
"hello" .*. HNil :: HList ( ([Char] :: *) ': ('[] :: [*]))
"hello" .*. HNil :: HList '[ String ]
"hello" .*. HNil :: HList '[ (String :: *) ]
Run Code Online (Sandbox Code Playgroud)

不能写类型级别列表cons前缀 - 我认为这是解析器中的一个错误:

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

<interactive>:4:31: parse error on input `:'
Run Code Online (Sandbox Code Playgroud)

明确的类型注释是不必要的,但您可以将它们放入其中.

ghc 7.8的印刷得到了改进:

>:t "hello" .*. HNil
"hello" .*. HNil :: HList '[[Char]]
Run Code Online (Sandbox Code Playgroud)