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