为了测试RandomGen
- reliant函数的目的,我需要一个RandomGen
实例,它将在实例化时返回我告诉它的数字,这样我就可以将测试函数的结果与正确的函数进行比较那些。即在每次调用random
时,我希望此函数返回列表[5, 8, 2, 6, 6]
中的下一个数字(如果它到达结尾可能会引发错误,或者它可能会循环)。我希望创建该生成器的实例就像StaticGen [5, 8, 2, 6, 6]
一样。
我想知道是否存在这样的图书馆,或者我是否应该在我的测试中采取一些不同的方法。
关于更新:事实证明我最初通过指定next
函数而不是random
作为我想要从列表中返回值的函数来说错了。我道歉。
答案 0 :(得分:5)
好吧,你可以发布这样一个库。但它会很短。
newtype StaticGen = StaticGen [Int]
instance RandomGen StaticGen where
next (StaticGen (x:xs)) = (x, StaticGen xs)
next _ = error "No more random numbers!"
split x = (x, x) -- broken, but irrelevant
genRange _ = (0, maxBound) -- choose your own
好吧,如上所述,这不会告诉你传入的序列。你可以重写你的函数,所以不要采用这样的随机数生成器:
myFunction :: RandomGen g => g -> a -> (b, g)
他们这样工作:
myFunction :: forall g. (g -> (Int, g)) -> g -> a -> (b, g)
这样你可以将它与随机数生成器一起使用:
myFunction random g a
或者您可以将其与列表一起使用:
myFunction (\(x:xs) -> (x, xs)) [1,2,3,4] a