haskell - 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?
解决方案
但是,当您的函数签名使用 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 类型更可取;您希望您的功能保持通用,因此您可以在必要时在他们的呼叫站点专门化它们。
推荐阅读
- javascript - javascripty中基于大小写字母的字符串匹配
- cors - nodemcu esp8266中的CORS问题
- c# - 如何将此 Task.WhenAll() 实现转换为 Parallel.ForEach()?
- ios - Whatsapp ChatStorage.sqlite 文件已损坏
- python - 创建中断 (ISR) 以创建平滑的机械臂运动
- python - 如何在 Python 中获取 CFFI 函数的 `const` 修饰符?
- node.js - 使用 VSCode 在 Docker 容器中调试 Typescript 文件
- ionic-framework - PWA 服务工作者缓存/更新预期行为
- go - govips Option struct 如何设置白色背景
- winapi - 如何创建具有以下属性的内存区域/部分(由 QueryWorkingSetEx 和 VirtualQuery 检查)?