gpt4 book ai didi

haskell - GHCI 不能在编译时推断 Eq 类,但在运行时可以吗?

转载 作者:行者123 更新时间:2023-12-02 02:50:45 25 4
gpt4 key购买 nike

对不起,令人困惑的标题。我在 Haskell 中编写一个解析器组合库是为了好玩。以下是所有(我认为!)相关的类型注释和定义:

data Parser a = Parser (State -> Reply a)

parse :: Parser a -> [Char] -> Either ParseError a

nil :: Parser [a]
nil = Parser $ \state -> Ok [] state

基本上, parse函数应用 Parser 的函数环绕到当前状态,如果解析成功,将结果包裹在 Either 中. nil parser 接受一个状态并返回对空列表的成功解析。所以我们应该有,
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

在这一点上,我很困惑为什么表达式在评估时可以正常工作,但无法在参数化版本中编译。

最佳答案

由于nil是多态的,Right []也是多态 GHC 的表达式类型为 Bool ,但中间有一些未绑定(bind)的类型变量。 GHC 因不知道使用哪种具体类型而倒下并死亡。 GHCi 是好是坏,将推断 [()]或类似的东西,因为它的默认规则。这是 ghci 的怪癖之一,它会自动默认类型变量。

要解决此问题,只需强制绑定(bind) a手动

-- It's important that whatever you force it to actually is comparable
-- eg there should be an instance like
instance Eq ParseError where
-- Otherwise you're kinda stuck.

prop_nil xs = parse nil xs == (Right xs :: Either ParseError String)

PS我喜欢Parsimony这个解析器库的名字,祝你好运!

关于haskell - GHCI 不能在编译时推断 Eq 类,但在运行时可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17780190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com