我在Kata的随机测试部分中有以下工作代码:
it "handles randoms " $
property $ \x y -> updateHealth x y == if y > x then 0 else x-y
但是我希望函数签名使用Num,但是当我这样做时,我得到一个错误,因为(我相信)它不知道如何生成Nums(因为它不知道要制作哪种Nums? )。我只是将类型设置为Double来解决。
但是,当函数签名使用Nums时,有什么方法可以使用Quickcheck?您是否必须专门告诉它生成随机的Int或Integer,Float或Double?
答案 0 :(得分:1)
但是,当函数签名使用Nums时,有什么方法可以使用Quickcheck?您是否必须专门告诉它生成随机的Int或Integer,Float或Double?
正如@AJFarmar所说,Num
是类型类(类型族),而不是特定类型。
您可以将QuickCheck与Num a => a -> a -> a
之类的功能一起使用,只需要通过注释专门化类型即可。您可以注释updateHealth
函数,也可以注释属性函数本身:
it "handles randoms " $
property $ \x y -> (updateHealth :: Int -> Int -> Int) x y == if y > x then 0 else x-y
(或)
it "handles randoms " $
property ((\x y -> updateHealth x y == if y > x then 0 else x-y) :: Int -> Int -> Bool)
在定义updateHealth
的类型时,最好使用这些选项;您希望您的功能保持通用性,因此可以在必要时在其呼叫站点进行专门化处理。