生成器排序导致 Scala 中 For Comprehension 中的无限递归

问题描述

在以下代码中,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 (将#修改为@)