haskell - 使用快速检查

标签 haskell ghci fold quickcheck

我为foldl编写了一个实现,想检查它是否有效,我尝试了一些案例,它似乎运行良好,但我想确定一下。

我读到了有关quickCheck的内容并尝试了它,但我似乎无法让它工作,这是代码

foldl'' :: (b -> a -> b) -> b -> [a] -> b

test :: Eq b => (b -> a -> b) -> b -> [a] -> Bool
test f e ls = foldl'' f e ls == foldl f e ls

当我运行 quickCheck 测试 时,它会抛出以下错误:

No instance for (Show (b0 -> a0 -> b0))
  arising from a use of `quickCheck'
Possible fix:
  add an instance declaration for (Show (b0 -> a0 -> b0))
In the expression: quickCheck prueba
In an equation for `it': it = quickCheck prueba

最佳答案

您的属性需要三个输入:函数、元素和列表。问题在于 QuickCheck 不知道如何处理一般函数。

QuickCheck 需要工作的事情之一是将失败的测试用例写入控制台的能力。为此,它需要可以转换为 String 的值 - Show 类中的任何内容。由于函数不在 Show 中,因此无法将它们用于输入。这就是您的错误消息的来源。

一般来说,使用随机生成的函数进行测试会非常棘手。我只需编写一些具体函数,然后让 QuickCheck 随机生成起始值和元素列表。

关于haskell - 使用快速检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16201741/

相关文章:

haskell - Int 到 Float 转换 : no instance for Num [Int]

multithreading - 纯 Haskell 代码是否需要线程池?

haskell - 在调试我的 State Monad 时,根据跟踪的位置颠倒顺序

haskell - Applicative 的 ghci 特例?

python reduce 找到集合的并集

performance - 如何在 Haskell 中编写高效的动态规划算法?

Haskell - fmap fmap 不起作用

haskell - 如何清除 Haskell 中的终端屏幕?

apache-spark - Spark : Difference Between Reduce() vs Fold()

haskell - `++` 的 `foldr` 实现是如何工作的?