我试图在Haskell中解析正整数,我写了这个:
number :: [Char] st Data.Functor.Identity.Identity [Char]
number = do
many1 digit
但是我收到了这个错误:
• Expecting three fewer arguments to ‘[Char]’
Expected kind ‘k0 -> (* -> *) -> * -> *’, but ‘[Char]’ has kind ‘*’
• In the type signature:
number :: [Char] st Identity [Char]
Failed, modules loaded: none.'
为什么抛出此错误,我该如何解决?
答案 0 :(得分:4)
这就是这里的错误类型。
如果你在终端上写:t many1 digit
,你会得到:
Prelude Text.Parsec.Combinator Text.Parsec.Char Text.Parsec.Prim> :t many1 digit
many1 digit :: Stream s m Char => ParsecT s u m [Char]
因此,您可以将函数的类型签名写为:
number :: Stream s m Char => ParsecT s u m [Char]
number = many1 digit
(或简单地省略类型签名)。
我不明白为什么你想要一个不那么通用的类型签名,因为将来你可能希望用number
代替其他东西。
编译器给出此错误的原因是因为类型[Char]
具有“无类型参数”,您可以填写。因此编译器很难混淆为什么用{{1}调用[Char]
等等。