小编jrs*_*l92的帖子

Scala向右折叠并向左折叠

我正在尝试学习函数式编程和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)

那么左右实际折叠的是什么呢?为什么需要"实用"方法?有许多其他方法使用它们,我也很难理解它们,因为我没有得到这两个.

functional-programming scala purely-functional foldleft

9
推荐指数
2
解决办法
4056
查看次数

Haskell:顺序斐波那契比并行更快

因此,我正在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)

parallel-processing haskell fibonacci

1
推荐指数
1
解决办法
269
查看次数