jrs*_*l92 9 functional-programming scala purely-functional foldleft
我正在尝试学习函数式编程和Scala,所以我正在阅读Chiusano和Bjarnason的"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)
}
Run Code Online (Sandbox Code Playgroud)
Cons和Nil是:
case class Cons[+A](head: A, tail: List[A]) extends List[A]
case object Nil extends List[Nothing]
Run Code Online (Sandbox Code Playgroud)
那么左右实际折叠的是什么呢?为什么需要"实用"方法?有许多其他方法使用它们,我也很难理解它们,因为我没有得到这两个.
小智 20
根据我的经验,锻炼直觉的最好方法之一是看看它如何在非常简单的例子中起作用:
List(1, 3, 8).foldLeft(100)(_ - _) == ((100 - 1) - 3) - 8 == 88
List(1, 3, 8).foldRight(100)(_ - _) == 1 - (3 - (8 - 100)) == -94
Run Code Online (Sandbox Code Playgroud)
如您所见,foldLeft/Right只需将列表元素和前一个应用程序的结果传递给第二个括号中的操作即可.还应该提到的是,如果将这些方法应用于同一个列表,只有应用的操作是关联的,它们才会返回相同的结果.
假设你有一个数字列表,你想把它们全部加起来。你会怎么做?您将第一个和第二个相加,然后取其结果,将其添加到第三个,取其结果,将其添加到第四个......依此类推。
这就是折叠让你做的事情。
List(1,2,3,4,5).foldLeft(0)(_ + _)
Run Code Online (Sandbox Code Playgroud)
"+" 是您要应用的函数,第一个操作数是其应用于元素的结果,第二个操作数是下一个元素。由于您没有第一个应用程序的“到目前为止的结果”,因此您提供了一个起始值 - 在本例中为 0,因为它是要添加的标识元素。
假设您想将所有列表元素与 fold 相乘,那就是
List(1,2,3,4,5).foldLeft(1)(_ * _)
Run Code Online (Sandbox Code Playgroud)
Fold 有自己的维基百科页面,您可能需要查看。
当然,foldLeft和foldRight也有 ScalaDoc 条目。
| 归档时间: |
|
| 查看次数: |
4056 次 |
| 最近记录: |