gpt4 book ai didi

haskell - 如何在main中使用quickcheck

转载 作者:行者123 更新时间:2023-12-02 16:04:14 26 4
gpt4 key购买 nike

我正在为我编写的二分搜索函数编写测试。

module Tests where

import Data.List (sort)
import Test.QuickCheck
import BinarySearch (binarySearch)

prop_equals_elem x xs = (binarySearch x $ sort xs) == (x `elem` xs)

args = Args {replay = Nothing, maxSuccess = 200, maxDiscard=200, maxSize=200, chatty = False}

main = do
quickCheck (prop_equals_elem :: (Ord a) => a -> [a] -> Bool)

在 ghci 中使用 QuickCheck 效果很好,但是当我尝试运行 main 时,它给出了错误

Tests.hs:12:5:
Ambiguous type variable `a0' in the constraints:
(Arbitrary a0) arising from a use of `quickCheckWith'
at Tests.hs:12:5-18
(Show a0) arising from a use of `quickCheckWith'
at Tests.hs:12:5-18
(Ord a0) arising from an expression type signature
at Tests.hs:12:26-72

为什么这在 main 中不起作用,但在 ghci 中却起作用?

最佳答案

这可能是由 extended defaulting rules in GHCi 引起的.

当测试这样的函数时,您需要使用具体的元素类型。由于扩展规则,GHCi 会将元素类型默认为 (),但正常编译代码时不会发生这种情况,因此 GHC 告诉您它无法确定要使用哪种元素类型。

例如,您可以使用 Int 来代替测试。 () 对于测试此函数来说非常无用,因为所有元素都是相同的。

quickCheck (prop_equals_elem :: Int -> [Int] -> Bool)

如果它适用于 Int,那么由于参数性,它应该适用于任何类型。

关于haskell - 如何在main中使用quickcheck,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7149751/

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