我正在尝试将这个简单的parsec代码编译
import Text.Parsec
simple = letter
Run Code Online (Sandbox Code Playgroud)
但我一直收到这个错误
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
Run Code Online (Sandbox Code Playgroud)
fuz*_*fuz 19
我认为你已经违背了单态限制.此限制意味着:如果声明的变量没有显式参数,则其类型必须是单态的.这迫使类型检查器选择一个特定的实例Stream
,但它无法决定.
有两种方法可以对抗它:
给出simple
明确的签名:
simple :: Stream s m Char => ParsecT s u m Char
simple = letter
Run Code Online (Sandbox Code Playgroud)禁用单性限制:
{-# LANGUAGE NoMonomorphismRestriction #-}
import Text.Parsec
simple = letter
Run Code Online (Sandbox Code Playgroud)请参阅什么是单态限制?有关单形态限制的更多信息.