Codewars(Haskell 随机测试 QuickCheck)

Codewars (Haskell random testing 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, or Integer, Float or Double?

However is there a way to use Quickcheck when your function signature uses Nums? Do you have to tell it specifically to generate random Int, or Integer, Float or Double?

正如@AJFarmar 所述,Num 是一种类型 class(类型族),而不是特定类型。

您可以将 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 的类型;您希望您的功能保持通用,因此您可以在必要时在它们的调用站点专门化它们。