gpt4 book ai didi

haskell - 如何使用 QuickCheck 测试高阶函数?

转载 作者:行者123 更新时间:2023-12-03 22:28:46 31 4
gpt4 key购买 nike

我有一个要测试的高阶函数,我要测试的属性之一是它对传入的函数的作用。为了说明,这里是一个人为的例子:

gen :: a -> ([a] -> [a]) -> ([a] -> Bool) -> a

这个想法大致是这是一个示例生成器。我将从单个 a 开始,创建 [a] 的单例列表,然后制作 [a] 的新列表直到谓词告诉我停止。调用可能如下所示:
gen init next stop

在哪里
init :: a
next :: [a] -> [a]
stop :: [a] -> Bool

这是我要测试的属性:

On any call to gen init next stop, gen promises never to pass an empty list to next.



我可以使用 QuickCheck 测试此属性吗 ,如果是这样,怎么办?

最佳答案

虽然如果您提供 gen 的实现会有所帮助, 我是
猜测它是这样的:

gen :: a -> ([a] -> [a]) -> ([a] -> Bool) -> a
gen init next stop = loop [init]
where
loop xs | stop xs = head xs
| otherwise = loop (next xs)

您要测试的属性是 next从未提供过
空列表。测试这个的一个障碍是你想检查一个 gen 内部的内部循环不变量,所以这需要从
外。让我们修改 gen返回此信息:
genWitness :: a -> ([a] -> [a]) -> ([a] -> Bool) -> (a,[[a]])
genWitness init next stop = loop [init]
where
loop xs | stop xs = (head xs,[xs])
| otherwise = second (xs:) (loop (next xs))

我们使用 second
Control.Arrow .
原文 gen很容易用 genWitness: 定义
gen' :: a -> ([a] -> [a]) -> ([a] -> Bool) -> a
gen' init next stop = fst (genWitness init next stop)

由于惰性评估,这不会给我们带来太多开销。回到
属性(property)!要启用从 QuickCheck 显示生成的函数,
我们使用模块
Test.QuickCheck.Function .
虽然这里不是绝对必要的,但一个好习惯是
单态属性:我们使用 Int 的列表s 而不是允许
使它们成为单元列表的单态性限制。现在让我们声明
属性(property):
prop_gen :: Int -> (Fun [Int] [Int]) -> (Fun [Int] Bool) -> Bool
prop_gen init (Fun _ next) (Fun _ stop) =
let trace = snd (genWitness init next stop)
in all (not . null) trace

让我们尝试使用 QuickCheck 运行它:
ghci> quickCheck prop_gen

有些东西似乎在循环……当然是的: gen如果 stop 则循环在
来自 next 的列表绝不是 True !让我们尝试查看输入跟踪的有限前缀
反而:
prop_gen_prefix :: Int -> (Fun [Int] [Int]) -> (Fun [Int] Bool) -> Int -> Bool
prop_gen_prefix init (Fun _ next) (Fun _ stop) prefix_length =
let trace = snd (genWitness init next stop)
in all (not . null) (take prefix_length trace)

我们现在很快得到一个反例:
385
{_->[]}
{_->False}
2

第二个函数是参数 next ,如果它返回空列表,
然后是 gen 中的循环会给 next一个空列表。

我希望这能回答这个问题,并为您提供一些见解
如何使用 QuickCheck 测试高阶函数。

关于haskell - 如何使用 QuickCheck 测试高阶函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9686665/

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