我正在尝试将这个简单的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
答案 0 :(得分:19)
我认为你违反了单态限制。此限制意味着:如果声明的变量没有显式参数,则其类型必须是单态的。这迫使类型检查器选择Stream
的特定实例,但它无法决定。
有两种方法可以对抗它:
给simple
一个明确的签名:
simple :: Stream s m Char => ParsecT s u m Char
simple = letter
禁用单性限制:
{-# LANGUAGE NoMonomorphismRestriction #-}
import Text.Parsec
simple = letter
有关单态性限制的更多信息,请参阅What is the monomorphism restriction?。