在Scala中的’Data types ala Carte’中编写foldTerm
发布时间:2020-12-16 18:37:59 所属栏目:安全 来源:网络整理
导读:我正在尝试在 Scala中编写 Data Types ala Carte的foldTerm函数.这是我到目前为止所得到的 def foldTerm[F[+_],A,B](e: Free[F,A],pure: A ? B,imp: F[B] ? B)(implicit F: Functor[F]): B = e.resume match { case Right(a) ? pure(a) case Left(x) ? imp(F
我正在尝试在
Scala中编写
Data Types ala Carte的foldTerm函数.这是我到目前为止所得到的
def foldTerm[F[+_],A,B](e: Free[F,A],pure: A ? B,imp: F[B] ? B)(implicit F: Functor[F]): B = e.resume match { case Right(a) ? pure(a) case Left(x) ? imp(F.map(x)(foldTerm(_,pure,imp))) } 这可行,但由于Scala无法正确优化尾递归,因此会导致SOE.我试图用蹦床修复它,但到目前为止还没有运气.我觉得我应该能够使用免费的现有方法来做到这一点,但我的所有尝试都以挫败感结束. 我错过了什么? 解决方法
Scala可以正确地消除尾递归调用.但是你的方法不是尾递归的.您可以使用@ annotaion.tailrec注释进行检查.
@annotation.tailrec def foldTerm[F[+_],imp))) } <console>:19: error: could not optimize @tailrec annotated method foldTerm: it contains a recursive call not in tail position case Left(x) ? imp(F.map(x)(foldTerm(_,imp))) 你最后一次打电话是imp而不是foldTerm. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |