gpt4 book ai didi

haskell - QuickCheck:如何组合两个生成器?

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

我有两个生成器,gen_ngen_arr:

gen_n :: Gen Int
gen_n = suchThat arbitrary (\i -> i >= 0 && i <= 10)

gen_elem :: Gen Int
gen_elem = suchThat arbitrary (\i -> i >= 0 && i <= 100)

gen_arr :: Gen [Int]
gen_arr = listOf gen_elem

如何将这两个组合成一个 Gen (Int, [Int])

combine_two_gens :: Gen a -> Gen b -> Gen (a, b)

最佳答案

(i) 您可以使用正常的仿函数/一元组合来组合它们:

gen_comb :: Gen (Int, [Int])
gen_comb = (,) <$> gen_elem <*> gen_arr

(当然,Control.Applicative.liftA2Control.Monad.liftM2 也可以)

(ii) 不要使用 suchThat 来仅仅限制范围。它的效率可能非常低,因为它只是生成随机实例,直到满足条件为止,而丢弃其余的实例。相反,您可以使用 elements::[a] -> Gen a:

gen_elem' :: Gen Int
gen_elem' = elements [0..100]

gen_arr' :: Gen [Int]
gen_arr' = listOf gen_elem'

gen_comb' :: Gen (Int, [Int])
gen_comb' = (,) <$> elements [0..100] <*> listOf (elements [0..100])

更新: 正如 Zeta 在下面所说,在这种情况下我们可以做得更好,通过使用 choose (0,100) (choose::Random a => (a, a) -> Gen a) 而不是 elements [0..100]。请参阅here ,或here查看生成器组合器的完整列表。

<小时/>
*Main> sample gen_arr'
[78]
[2,27]
[12,39]
[92,22,40,6,18,19,25,13,95,99]
...
*Main> sample gen_comb'
(9,[23,3])
(11,[67,38,11,79])
(5,[96,69,68,81,75,14,59,68])
...

suchThatelement:

*Main> sample (suchThat arbitrary (\i -> i >= 10000 && i <= 10005))
^CInterrupted.
*Main> sample (elements [10000..10005])
10003
10002
10000
10000
...

suchThat 生成器没有输出任何内容。

关于haskell - QuickCheck:如何组合两个生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31703966/

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