我正在尝试学习函数式编程和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)
那么左右实际折叠的是什么呢?为什么需要"实用"方法?有许多其他方法使用它们,我也很难理解它们,因为我没有得到这两个.
因此,我正在Haskell中尝试并行处理。我举了一个经典的示例,该示例以顺序和并行方式实现斐波那契数列方法。这是我的Main.hs文件:
module Main where
import Control.Parallel
main = print (fib 47)
fib :: Int -> Int
fib n
| n <=1 = n
| otherwise = fib (n-1) + fib (n-2)
Run Code Online (Sandbox Code Playgroud)
我编译ghc -O2 --make Main.hs -threaded -rtsopts
并执行,time ./Main +RTS -N4
这给了我:
2971215073
63.23user 13.03system 0:20.30elapsed 375%CPU (0avgtext+0avgdata 3824maxresident)k
0inputs+0outputs (0major+276minor)pagefaults 0swaps
Run Code Online (Sandbox Code Playgroud)
因此,使用正常的斐波那契大约需要20秒。
现在,如果我将fib方法更改为
pfib :: Int -> Int
pfib n
| n <= 1 = n
| otherwise = n1 `par` (n2 `par` n1 + n2)
where …
Run Code Online (Sandbox Code Playgroud)