【问题标题】:Codewars (Haskell random testing QuickCheck)Codewars(Haskell 随机测试 QuickCheck)
【发布时间】:2018-08-01 22:12:34
【问题描述】:

我在 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,是不是一定要专门告诉它?

【问题讨论】:

  • Num 不是类型;它是一个类型类,即类型的集合。因此,您必须指定要使用的特定类型。没有办法解决这个问题,因为编译器无法选择要使用的 Num 的特定实例(在大多数情况下;请参阅:单态限制)

标签: haskell quickcheck


【解决方案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 的类型更可取;您希望您的功能保持通用,因此您可以在必要时在其调用站点上对它们进行专门化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多