Trivial parsec示例产生类型错误

时间:2011-07-17 10:24:31

标签: haskell parsec

我正在尝试将这个简单的parsec代码编译成

import Text.Parsec
simple = letter

但我一直收到此错误

No instance for (Stream s0 m0 Char)
  arising from a use of `letter'
Possible fix: add an instance declaration for (Stream s0 m0 Char)
In the expression: letter
In an equation for `simple': simple = letter

1 个答案:

答案 0 :(得分:19)

我认为你违反了单态限制。此限制意味着:如果声明的变量没有显式参数,则其类型必须是单态的。这迫使类型检查器选择Stream的特定实例,但它无法决定。

有两种方法可以对抗它:

  1. simple一个明确的签名:

    simple :: Stream s m Char => ParsecT s u m Char
    simple = letter
    
  2. 禁用单性限制:

    {-# LANGUAGE NoMonomorphismRestriction #-}
    import Text.Parsec
    simple = letter
    
  3. 有关单态性限制的更多信息,请参阅What is the monomorphism restriction?