我想学习函数式编程和Scala,所以我正在阅读Chiusano和Bjarnason的“Scala函数式编程”。在遇到列表时,我无法理解折叠方式和折叠方式。我在这里环顾四周,但我没有找到一些初学者友好的东西。因此,通过这本书提供的代码是:Scala向右折叠并向左折叠
def foldRight[A,B](as: List[A], z: B)(f: (A, B) => B): B = as match {
case Nil => z
case Cons(h, t) => f(h, foldRight(t, z)(f))
}
def foldLeft[A,B](l: List[A], z: B)(f: (B, A) => B): B = l match {
case Nil => z
case Cons(h,t) => foldLeft(t, f(z,h))(f)
}
凡缺点和无是:
case class Cons[+A](head: A, tail: List[A]) extends List[A]
case object Nil extends List[Nothing]
那么你实际上倍左右吗?为什么需要作为“实用”方法?还有很多其他方法使用它们,我也很难理解它们,因为我没有那两个。
看看下一个线程。 http://stackoverflow.com/questions/24370549/foldleft-v-foldright-does-it-matter关于这些操作有很多信息。看起来像对我来说是重复的。 – Pavel
在这个问题中,用户似乎对手头的事情有了很好的理解,我不这么认为,这是我想要帮助的。 – jrsall92
对于您提供的代码。你有什么具体的问题吗?究竟是什么造成了困难?句法 ?理解差异的关键是在这两种情况下递归调用的方式。这不一样。阅读关于尾递归。希望这会有所帮助。更多链接:https://oldfashionedsoftware.com/2009/07/10/scala-code-review-foldleft-and-foldright/ – Pavel