我一个功能,rev
,对于一个类型,有三种类型类返回一些值:如何(在我的情况正)使用改性剂与快速检查
rev :: (Integral a, Show a, Read a) => a -> a
rev = read . reverse . show
我想测试一些财产关于它与quickcheck。虽然,我对测试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,必须声明的Read
这Positive
东西的实例”。所以我就这么做了,但是这个实例已经在quickCheck库中声明了,因为ghci对我发出了尖叫。
在这一点上,我迷路了,因为我没有找到好的文档(如果有的话)。
任何帮助我理解quickcheck库中的修饰符和其他好东西的指针都会被赞赏。
没有解析,因为'rev(Positive {getPositive = 1})'是'read'} 1 = evitisoPteg {evitisoP“'。 –