gpt4 book ai didi

haskell - 针对带函数的简单测试运行 QuickCheck

转载 作者:行者123 更新时间:2023-12-04 11:36:12 26 4
gpt4 key购买 nike

鉴于以下情况:

test :: (Int -> Int) -> Int -> Bool
test _ _ = True

编译源码后,我尝试运行 quickCheck test :
> quickCheck test
<interactive>:27:1:
No instance for (Show (Int -> Int))
arising from a use of ‘quickCheck’
In the expression: quickCheck test
In an equation for ‘it’: it = quickCheck test

看着这个 Show instance for functions ,在我看来,不存在这样的例子。

如何运行 quickCheck test ,即绕过或解决丢失的 Show Int -> Int 的实例?

最佳答案

QuickCheck 有一个特殊的模块 Test.QuickCheck.Function 用于生成可以显示的“函数”(也可以“缩小”,这是 QuickCheck 简化其反例的方式)。您可以使用 apply 将它们转换为普通函数。 .例如,如果您有文件:

import Test.QuickCheck
import Test.QuickCheck.Function

test :: Fun Int Int -> Int -> Bool
test _ _ = True

test2 :: Fun Int Int -> Int -> Bool
test2 f x = apply f x == x

然后在 GHCi 中:
*Main> quickCheck test
+++ OK, passed 100 tests.
*Main> quickCheck test2
*** Failed! Falsifiable (after 2 tests and 3 shrinks):
{_->0}
1

实际上可以定义一个 Show例如函数本身,并使用它。但除非您的输入类型是有限类型,如 Bool ,您将无法以这种方式打印有关该功能的所有信息。您可以从 Text.Show.Functions 导入一个没有显示有用信息的虚拟实例。 .

但是, Test.QuickCheck.Function.Fun上面使用的类型看起来像是为了更简洁地提供基本信息而设计的,所以如果可能的话,我当然会自己使用它。

关于haskell - 针对带函数的简单测试运行 QuickCheck,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32707454/

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