gpt4 book ai didi

quickcheck - 使用 QuickCheck 生成 Int 列表

转载 作者:行者123 更新时间:2023-12-04 07:02:05 27 4
gpt4 key购买 nike

我正在处理 Real WorldHaskell其中一个
第4章的练习是实现一个foldr基于版本的concat .我认为这将是一个很好的测试候选者
QuickCheck 因为有一个现有的实现来验证我的
结果。然而,这需要我定义一个实例Arbitrary可以生成任意类型的类型类 [[Int]] .到目前为止我有
一直无法弄清楚如何做到这一点。我的第一次尝试是:

module FoldExcercises_Test
where

import Test.QuickCheck
import Test.QuickCheck.Batch

import FoldExcercises

prop_concat xs =
concat xs == fconcat xs
where types = xs ::[[Int]]


options = TestOptions { no_of_tests = 200
, length_of_tests = 1
, debug_tests = True }

allChecks = [
run (prop_concat)
]

main = do
runTests "simple" options allChecks

这导致不执行任何测试。查看各种位和
件我猜是 Arbitrary需要实例声明并且
添加
    instance Arbitrary a => Arbitrary [[a]] where
arbitrary = sized arb'
where arb' n = vector n (arbitrary :: Gen a)

这导致 ghci 提示我的实例声明是
无效,添加 -XFlexibleInstances 可能会解决我的问题。
添加 {-# OPTIONS_GHC -XFlexibleInstances #-}指示
导致类型不匹配和重叠实例警告。

所以我的问题是需要什么才能完成这项工作?我显然是新来的
到 Haskell 并且找不到任何可以帮助我的资源。
任何指针都非常感谢。

编辑

在以测试为先的方式时,我似乎被 QuickCheck 的输出误导了 fconcat被定义为
fconcat = undefined  

实际正确地实现该功能确实给出了预期的结果。 DOOP !

最佳答案

[[Int]]已经是 Arbitrary实例(因为 Int 是一个 Arbitrary 实例,对于所有 [a] 本身就是 a 实例的 Arbitrary 也是如此)。所以这不是问题。

我自己运行了你的代码(用 import FoldExcercises 替换了 fconcat = concat ),它按照我的预期运行了 200 次测试,所以我很困惑为什么它不适合你。但是您不需要添加 Arbitrary实例。

关于quickcheck - 使用 QuickCheck 生成 Int 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1690792/

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