gpt4 book ai didi

haskell - 如何使用 QuickCheck 生成任意二元函数?

转载 作者:行者123 更新时间:2023-12-01 12:18:54 25 4
gpt4 key购买 nike

我正在尝试使用 QuickCheck 测试我对 zipWith 的实现。我的实现 myZipWith,我想通过与标准函数进行比较来进行 QuickCheck 测试。像这样的东西:

main = do
quickCheck (prop_myZipWith :: (Int -> Int -> Int) -> [Int] -> [Int] -> Bool)

prop_myZipWith :: (a -> b -> c) -> [a] -> [b] -> Bool
prop_myZipWith f x y = (myZipWith x y) == (zipWith f x y)

这不起作用,因为 (Int -> Int -> Int) 不是 Arbitrary 的实例。

对于单参数函数,可以使用 Test.QuickCheck.Function 来解决这个问题的 Fun(实例化 Arbitrary)。例如:

main = do
quickCheck (prop_myMap :: Fun Int Int -> [Int] -> Bool)

prop_myMap :: Fun a b -> [a] -> Bool
prop_myMap (Fun _ f) l = (myMap f l) == (map f l)

除了生成两个参数的任意函数外,我正在尝试做一些类似的事情。

如何生成两个参数函数的任意实例,以便快速检查高阶函数(例如 zipWith)?

最佳答案

快速检查 2.9.2

在 QuickCheck 2.9.2 中,您可以使用 Fun 类型和 Fn 模式。你必须

import Test.QuickCheck.Function

然后您可以使用元组作为输入来编写属性,然后柯里化(Currying)函数:

prop_myZipWith :: Eq c => Fun (a, b) c -> [a] -> [b] -> Bool
prop_myZipWith (Fn f) x y = myZipWith (curry f) x y == zipWith (curry f) x y

main 看起来像这样:

main =
quickCheck (prop_myZipWith :: Fun (Int, Int) Int -> [Int] -> [Int] -> Bool)

在我的重现中编译,测试通过。

快速检查 2.10.0.1

使用 QuickCheck 2.10.0.1,您可以改为使用 Fn2 模式,如下所示:

prop_myZipWith :: Eq c => Fun (a, b) c -> [a] -> [b] -> Bool
prop_myZipWith (Fn2 f) x y = myZipWith f x y == zipWith f x y

主要方法保持不变,因为 prop_myZipWith 的类型没有改变,但是不再需要 import Test.QuickCheck.Function

关于haskell - 如何使用 QuickCheck 生成任意二元函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46016524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com