首页 > 解决方案 > Codewars(Haskell 随机测试 QuickCheck)

问题描述

我在 Kata 的随机测试部分有这个工作代码:

it "handles randoms " $ 
      property $ \x y -> updateHealth x y == if y > x then 0 else x-y

但是我希望函数签名使用 Num,但是当我这样做时,我得到了一个错误,因为(我相信)它不知道如何生成 Num(因为它不知道要制作什么样的 Num?)。我只是将类型设置为 Double 作为解决方法。

但是,当您的函数签名使用 Nums 时,有没有办法使用 Quickcheck?您是否必须专门告诉它生成随机 Int,或 Integer,Float 或 Double?

标签: haskellquickcheck

解决方案


但是,当您的函数签名使用 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's 类型更可取;您希望您的功能保持通用,因此您可以在必要时在他们的呼叫站点专门化它们。


推荐阅读