Haskell 在使用checker测试幺半群定律时,尽管定义了一个实例,但没有任意的实例
我正在阅读,并试图使用库为一个简单的Haskell 在使用checker测试幺半群定律时,尽管定义了一个实例,但没有任意的实例,haskell,quickcheck,monoids,Haskell,Quickcheck,Monoids,我正在阅读,并试图使用库为一个简单的Bool类数据类型的Monoid实例测试Monoid定律。但是,当我尝试在ghci中加载代码时,出现以下错误: badmoneid.hs:21:20:错误: •没有(QuickCheck-2.14:Test.QuickCheck.Arbitral.Arbitral)的实例 (公牛) 因使用“幺半群”而产生 •在“quickBatch”的第一个参数中,即“(幺半群Twoo)” 在表达式中:quickBatch(幺半群Twoo) 在“main”的等式中:main=
Bool
类数据类型的Monoid实例测试Monoid定律。但是,当我尝试在ghci
中加载代码时,出现以下错误:
badmoneid.hs:21:20:错误:
•没有(QuickCheck-2.14:Test.QuickCheck.Arbitral.Arbitral)的实例
(公牛)
因使用“幺半群”而产生
•在“quickBatch”的第一个参数中,即“(幺半群Twoo)”
在表达式中:quickBatch(幺半群Twoo)
在“main”的等式中:main=quickBatch(幺半群Twoo)
|
21 | main=quickBatch(幺半群Twoo)
| ^^^^^^^^^^^
失败,未加载任何模块。
不过,我已经为我的数据类型Bull
定义了一个任意的实例。我在互联网上搜索了Stack Overflow并找到了一个相关的。我已经尝试了那里给出的解决方案(使用GHC.Generics
),但它导致了相同的错误。
代码如下:
模块BadMonoid,其中
导入数据.幺半群
导入测试。快速检查
导入Test.QuickCheck.Checkers
导入Test.QuickCheck.class
数据牛=傻瓜|两个推导(等式,显示)
实例任意Bull在哪里
任意=频率[(1,返回傻瓜),(1,返回两个o)]
实例幺半群Bull在哪里
记忆=傻瓜
实例半群Bull在哪里
()傻瓜
实例EqProp Bull,其中(=-=)=eq
main::IO()
main=quickBatch(幺半群Twoo)
问题是安装了两个不兼容的QuickCheck版本。我们可以从错误消息中看出,因为它在类型中提到了版本(QuickCheck-2.14
):
• No instance for (QuickCheck-2.14:Test.QuickCheck.Arbitrary.Arbitrary
Bull)
正如Daniel提到的,解决方案是创建一个依赖于QuickCheck
和Checker
的Cabal项目,并使用Cabal命令(例如Cabal repl
)而不是直接使用GHC
默认情况下,GHC可以查看机器上安装的每个软件包的每个版本。但它不知道如何在两者之间做出选择。如果独立运行,它将选择它首先找到的任何包版本——这可能彼此不一致
进入阴谋集团。Cabal的主要功能是其解算器:它可以选择一组一致的包,并告诉GHC仅使用这些包。这就是为什么创建一个阴谋集团项目可以解决这个问题
通常,运行cabalinstall--lib
是一种反模式。(安装可执行文件是可以的,因为它们是自包含的。)如果需要从Hackage安装库,请创建一个依赖于库的Cabal项目。错误中包含QuickCheck版本号使我产生怀疑;通常这意味着依赖关系树的一部分包含一个版本的QuickCheck,而依赖关系树的另一部分包含一个不同的版本(例如,checkers
可能是针对版本2.14构建的,而您针对不同版本显示的文件中的任意
实例)。然而,标准构建工具的现代版本使得这种故障模式更难被击中;您是如何构建此代码的,以及在该过程中调用的程序的版本是什么?我已经使用cabal install checkers--lib安装了checkers
。我正在使用ghc 8.8.3。代码不在阴谋集团或堆栈项目中。尝试使用cabal info checkers
检查checkers
的版本时。当运行cabal install checkers--lib
显示最新的时,它会显示未安装的
。然后您自己调用ghc
进行构建,是吗?如果是这样,我强烈建议创建一个简单的阴谋包(cabal init
将引导您完成基本决策,并为您创建一个语法有效的启动文件),然后使用cabal build
而不是ghc
,cabal repl
而不是ghci
,等等。它在阴谋包中起作用。谢谢但是,我想知道为什么它在外面不起作用?我是否安装了两个版本的QuickCheck?为每一个简单的程序制作一个软件包是很耗费空间的。非常感谢。不过我有一个查询,我选中了~/.cabal/packages/hackage.haskell.org/QuickCheck/
,它只包含2.14
文件夹。如何查看系统范围内安装的软件包的每个版本?请尝试ghc pkg list QuickCheck
,或ghc pkg list
查看所有内容。令人惊讶的是,这两个命令都没有显示安装了QuickCheck
。这很奇怪。附近有档案吗?(我刚刚了解了这些…)我在目录中找不到任何包环境文件。