对不起,令人困惑的标题。我在 Haskell 中编写一个解析器组合库是为了好玩。以下是所有(我认为!)相关的类型注释和定义:
data Parser a = Parser (State -> Reply a)
parse :: Parser a -> [Char] -> Either ParseError a
nil :: Parser [a]
nil = Parser $ \state -> Ok [] state
基本上,该parse
函数将 aParser
包裹的函数应用于当前状态,如果解析成功,则将结果包裹在Either
. nil
解析器获取一个状态并返回对空列表的成功解析。所以我们应该有,
parse nil "dog" == Right []
事实上,如果我只是加载所有这些模块所在的模块,那么它会编译并且计算结果为 True。
不过,我实际上是在尝试在库上运行一些 QuickCheck 测试,所以我写了这个:
import Parsimony
import Test.QuickCheck
prop_nil :: [Char] -> Bool
prop_nil xs = parse nil xs == Right []
这无法编译!它抛出以下错误:
No instance for (Eq a0) arising from a use of `=='
The type variable `a0' is ambiguous
在这一点上,我很困惑为什么表达式在评估时可以正常工作,但无法在参数化版本中编译。