16

我正在尝试编译这个微不足道的 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
4

1 回答 1

19

我认为您已经违反了单态性限制。这个限制意味着:如果一个变量声明时没有显式参数,它的类型必须是单态的。这会强制类型检查器选择 的特定实例Stream,但它无法决定。

对抗它有两种方法:

  1. 给出simple明确的签名:

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

    {-# LANGUAGE NoMonomorphismRestriction #-}
    import Text.Parsec
    simple = letter
    

请参阅什么是单态限制?有关单态限制的更多信息。

于 2011-07-17T10:34:54.107 回答