haskell - 如何在 Quickcheck 中使用修饰符(在我的情况下为正)

标签 haskell quickcheck

我有一个函数,rev ,它为三个类型类中的类型返回一些值:

rev :: (Integral a, Show a, Read a) => a -> a
rev = read . reverse . show

我想用快速检查测试一些关于它的属性。不过,我对测试 Integral 类型的负值不感兴趣,因为我使用的是 Integer由于缺少 Natural输入基础库。所以我想,让我们取与生成的值为负时生成的值相反,我会没事的:
prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool
prop_id n | n >= 0    = (rev.rev) n == n
          | otherwise = let n' = -n in (rev.rev) n' == n'

(测试的属性在这里并不重要 - 特别是它不适用于非常基本的值,我知道,这不是这个问题的主题)

然后我遇到了Positive修改器并认为虽然我的测试现在正在运行,但最好以更好的方式实现它。所以我尝试了:
prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool
prop_id n = (rev.rev) n == n

我必须承认,当它编译时我很惊讶。但是在运行测试时弹出错误:
*** Failed! Exception: 'Prelude.read: no parse' (after 1 test): 
Positive {getPositive = 1}

所以我想,“mmk,必须将这个 Positive 东西声明为 Read 的实例”。所以我就这样做了,但该实例已经在 quickCheck 库中声明,似乎是因为 ghci 对我大喊大叫。

在这一点上我迷路了,因为我没有找到好的文档(如果有的话)。

任何帮助我理解快速检查库中的修饰符和其他好东西的指针都将不胜感激。

最佳答案

使用这些修饰符的常用方法是对它们进行模式匹配,例如

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool
prop_id (Positive n) = (rev.rev) n == n

这样,n将具有基础类型。

关于haskell - 如何在 Quickcheck 中使用修饰符(在我的情况下为正),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12466580/

相关文章:

unit-testing - 如何编写不模仿函数实现的 QuickCheck 测试?

haskell - Haskell 中的 CoArbitrary

haskell - Haskell 中的镜头与 Clojure 中使用按键序列之间有哪些异同?

haskell - 复杂状态 Monad 结构

haskell - 非详尽模式

haskell - 使用 QuickCheck monadicIO 时如何防止测试功能输出到终端

haskell - QuickCheck 值相等

unit-testing - 不变测试可以代替单元测试吗?

haskell - 无需类型构造函数即可满足 monad 法则

haskell - 模式匹配的严格性与解构性