gpt4 book ai didi

haskell - 是否可以在 QuickCheck 中生成任意函数

转载 作者:行者123 更新时间:2023-12-05 01:42:48 26 4
gpt4 key购买 nike

我正在尝试为身份编写一个 QuickCheck 测试

f $ y = f y

我最初的计划是编写一个返回函数和整数的任意生成器,签名为 Gen (Int -> Int, Int)

并且在 prop_DollerDoesNothing使用/不使用 $ 测试该功能应用程序给出相同的结果。

这是我的代码:

  prop_DollarDoesNothing :: Property
prop_DollarDoesNothing =
forAll arbitraryFuncInt (\(f, y) -> (f $ y) == (f y))

arbitraryFuncInt :: Gen (Int -> Int, Int)
arbitraryFuncInt = do
f <- elements [(\x -> x*2), (\x -> x+3), (\x -> x-2)]
y <- arbitrary :: Gen Int
return (f, y)

它生成了以下有用的错误消息:

    * No instance for (Show (Int -> Int))
arising from a use of `forAll'
(maybe you haven't applied a function to enough arguments?)
* In the expression:
forAll arbitraryFuncInt (\ (f, y) -> (f $ y) == (f y))
In an equation for `prop_DollarDoesNothing':
prop_DollarDoesNothing
= forAll arbitraryFuncInt (\ (f, y) -> (f $ y) == (f y))

因此,我通过应用任意函数并从 arbitraryFuncInt 返回一对整数来修复错误并使测试正常运行

  prop_DollarDoesNothing :: Property
prop_DollarDoesNothing =
forAll arbitraryFuncInt (\(x, y) -> x == y)

arbitraryFuncInt :: Gen (Int, Int)
arbitraryFuncInt = do
f <- elements [(\x -> x*2), (\x -> x+3), (\x -> x-2)]
y <- arbitrary :: Gen Int
return (f $ y, f y)

我的问题是:

  1. 是否根本不可能返回由于没有 Show 的实例而未完全应用的任意函数? ?
  2. 我可以为Show (Int -> Int)写一个实例吗?制作# 1可能吗?
  3. QuickCheck 能否在给定类型签名的情况下生成任意函数,对于我正在测试对所有函数(给定类型)都是真实的身份的情况。上面,我手动指定了 3 个测试函数,我想以某种方式自动化它,理想情况下是这样的 f <- arbitrary :: Gen (Int -> Int)

最佳答案

QuickCheck 支持生成、收缩和显示函数,使用 Fun 类型。 CoArbitrary 启用函数生成。然后将其转换为(可能是无限的)类似 trie 的结构,可以对其进行检查并将其缩小为有限值(因为测试失败仅取决于有限多个输入),然后可以将其显示为反例。

具体来说,您可以将属性编写为采用 Fun 参数的函数,该参数是 (->) 使用我描述的机制的包装器。用 Fn 模式解构它得到一个函数。

prop_dollarDoesNothing :: Property
prop_dollarDoesNothing = property $ \(Fn (f :: Int -> Int)) x ->
(f $ x) === f x

更多信息

关于haskell - 是否可以在 QuickCheck 中生成任意函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50629967/

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