【发布时间】:2019-03-10 06:12:05
【问题描述】:
在Functional Programming in Scala,作者要求通过FoldLeft 表达FoldRight。然后作者提供以下implementation:
def foldRightViaFoldLeftAuthor[A, B](l: List[A], z: B)(f: (A, B) => B): B = {
foldLeft(l, (b: B) => b)((g, a) => b => g(f(a, b)))(z)
}
有几个问题,例如this,要求解释作者的解决方案。可能很多人还在努力理解它。
当我在思考这个任务时,我想出了一个不同的实现,至少对我来说,它似乎更具可读性和更容易掌握
def foldRightViaFoldLeftMy[A, B](l: List[A], z: B)(f: (A, B) => B): B = {
foldLeft(l, z)(((g: (A, B) => B) => (b: B, a: A) => g(a, b)) (f))
}
所以我基本上准备了一个将f(a,b) 转换为f(b,a) 的函数,现在我可以调用尾递归的foldLeft。
所以我的问题是:
- 有什么理由按照作者的方式实现吗?
- 与作者的相比,我的实现有什么缺点吗?
【问题讨论】:
标签: scala functional-dependencies