gpt4 book ai didi

haskell - 如何在 QuickCheck (Haskell) 中使用 'oneof'

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

我正在尝试编写一个更改数独的 Prop ,然后检查它是否仍然有效。

但是,我不确定如何正确使用“oneof”函数。您能给我一些提示吗?

prop_candidates :: Sudoku -> Bool
prop_candidates su = isSudoku newSu && isOkay newSu
where
newSu = update su aBlank aCandidate
aCandidate = oneof [return x | x <- candidates su aBlank]
aBlank = oneof [return x | x <- (blanks su)]

这里有一些更多信息...

type Pos = (Int, Int)
update :: Sudoku -> Pos -> Maybe Int -> Sudoku
blanks :: Sudoku -> [Pos]
candidates :: Sudoku -> Pos -> [Int]
[return x | x <- (blanks example)] :: (Monad m) => [m Pos]

我已经在这个 Prop 上苦苦挣扎了 3 个小时,所以欢迎任何想法!

最佳答案

我的意思是你的类型混淆了。也就是说,aBlank 不是 Pos,而是 Gen Pos,因此 update su aBlank aCandidate 没有任何意义!事实上,您想要的是一种在给定初始数独的情况下生成新数独的方法;换句话说,一个函数

similarSudoku :: Sudoku -> Gen Sudoku

现在我们可以编写它:

similarSudoku su = do aBlank <- elements (blanks su) 
-- simpler than oneOf [return x | x <- blanks su]
aCandidate <- elements (candidates su aBlank)
return (update su aBlank aCandidate)

或者更简单:

similarSudoku su = liftM2 (update su) (elements (blanks su)) (elements (candidates su aBlank))

该属性看起来像

prop_similar :: Sudoku -> Gen Bool
prop_similar su = do newSu <- similarSudoku su
return (isSudoku newSu && isOkay newSu)

既然有实例

Testable Bool
Testable prop => Testable (Gen prop)
(Arbitrary a, Show a, Testable prop) => Testable (a -> prop)

Sudoku -> Gen Bool 也是可测试(假设实例任意数独)。

关于haskell - 如何在 QuickCheck (Haskell) 中使用 'oneof',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1828850/

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