我有一个功能, rev
,对于一个类型,有三种类型类返回一些值:
rev :: (Integral a, Show a, Read a) => a -> a
rev = read . reverse . show
我想测试一些特性有关它快速检查。 虽然,我不感兴趣,因为我使用测试整型负值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
修改,并认为虽然我的测试,现在被functionning,它会是不错的执行它在一个更好的方式。 所以我想:
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
”。 所以,我就是这样做的,但该实例中,似乎是因为ghci的尖叫我的快速检查库中已经声明。
而在这一点上,我输了,因为我没有找到良好的文档(如果有的话)。
任何指针帮助我了解在快速检查库剂和其它好东西可以理解的。