Codewars(Haskell随机测试QuickCheck)

时间:2018-08-01 22:12:35

标签: haskell quickcheck

我在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?

1 个答案:

答案 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的类型时,最好使用这些选项;您希望您的功能保持通用性,因此可以在必要时在其呼叫站点进行专门化处理。