我正在尝试为sGen[Stream[A]]
的无限(延迟评估)流定义 a ,A
其中每个元素A
都可以依赖于先前的元素。
作为最小的情况,我们可以取下Gen[Stream[Int]]
一个元素是前一个元素+1
或+2
前一个元素的位置。这里是一个haskell实现供参考:
increasingInts :: Gen [Int]
increasingInts = arbitrary >>= go
where
go seed = do
inc <- choose (1,2)
let next = seed + inc
rest <- go next
return (next : rest)
我已经尝试Gen.sequence
过Stream[Gen[A]]
但有一个stackoverflow。我也尝试Gen
从头开始定义,但构造函数gen
是Gen
私有的,并且适用于私有方法/类型。
这种尝试也给出了stackoverflow。
def go(seed: Int): Gen[Stream[Int]] =
for {
inc <- Gen.choose(1, 2)
next = seed + inc
rest <- Gen.lzy(go(next))
} yield next #:: rest
val increasingInts: Gen[Stream[Int]] = go(0)
increasingInts(Gen.Parameters.default, Seed.random()).get foreach println
所以我被困住了。有任何想法吗?