Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在使用checker测试幺半群定律时,尽管定义了一个实例,但没有任意的实例_Haskell_Quickcheck_Monoids - Fatal编程技术网

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
。这很奇怪。附近有档案吗?(我刚刚了解了这些…)我在目录中找不到任何包环境文件。