Haskell:解析正整数

时间:2017-03-30 23:13:58

标签: haskell parsec

我试图在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.'

为什么抛出此错误,我该如何解决?

1 个答案:

答案 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]等等。