加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读