【发布时间】:2012-09-10 02:26:06
【问题描述】:
我有一个函数,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 对我大喊大叫。
此时我迷路了,因为我找不到好的文档(如果有的话)。
任何帮助我理解快速检查库中的修饰符和其他好东西的指针都将不胜感激。
【问题讨论】:
-
没有解析,因为
rev (Positive {getPositive = 1})是read "}1 = evitisoPteg{ evitisoP"。
标签: haskell quickcheck