-->

如何使用快速检查修饰符(正在我的情况)(How to use modifiers with Quic

2019-09-22 13:00发布

我有一个功能, 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的尖叫我的快速检查库中已经声明。

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

任何指针帮助我了解在快速检查库剂和其它好东西可以理解的。

Answer 1:

使用这些改性剂的常用方法是模式匹配它们,例如

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

这样一来, n会有潜在的类型。



文章来源: How to use modifiers with Quickcheck (Positive in my case)