我正在尝试使用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但却无法找到:*:.
在较旧版本的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)