2012-09-17 31 views
7

我一个功能,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,必须声明的ReadPositive东西的实例”。所以我就这么做了,但是这个实例已经在quickCheck库中声明了,因为ghci对我发出了尖叫。

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

任何帮助我理解quickcheck库中的修饰符和其他好东西的指针都会被赞赏。

+5

没有解析,因为'rev(Positive {getPositive = 1})'是'read'} 1 = evitisoPteg {evitisoP“'。 –

回答

17

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

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

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

+0

等等,甚至没有想到要尝试。傻我。谢谢 :) – m09