问题描述
在以下代码中,for-comprehension 中生成器顺序的改变导致了无限递归。
以下代码给出无限递归
lazy val genHeap: Gen[H] = oneOf(const(empty),for {
heap <- genHeap
value <- arbitrary[Int]
} yield insert(value,heap))
虽然下面的代码有效
lazy val genHeap: Gen[H] = oneOf(const(empty),for {
value <- arbitrary[Int]
heap <- genHeap
} yield insert(value,heap))
以上函数定义在一个名为QuickCheck
的抽象类中,代码调用如下
object quickcheck extends QuickCheck
quickcheck.genHeap
我认为,原因是在第一种情况下,genHeap
等价于
oneOf(const(empty),genHeap flatMap (heap => arbitrary[Int] map (value => insert(value,heap)))
由于oneOf
是按值取生成器,内部的genHeap也会被执行,导致无限递归。
在第二种情况下,genHeap
在 flatMap 内部,所以它不需要在函数调用之前执行。
我的解释是否正确?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)