使用Control.Parallel到Scala的端口Haskell代码
发布时间:2020-12-16 10:03:53 所属栏目:安全 来源:网络整理
导读:下面的 Haskell代码使用par和pseq做一些多核数字运算作为玩具来显示正在使用的几个核心.在 Scala中表达这个最简单,最惯用的方法是什么?期货和承诺似乎很有希望(咳咳),我一直在关注scalaz.concurrent,例如 this example,但我找不到文档来解释这一切. import
下面的
Haskell代码使用par和pseq做一些多核数字运算作为玩具来显示正在使用的几个核心.在
Scala中表达这个最简单,最惯用的方法是什么?期货和承诺似乎很有希望(咳咳),我一直在关注scalaz.concurrent,例如
this example,但我找不到文档来解释这一切.
import Control.Parallel main = a `par` b `par` c `pseq` print (a + b + c) where a = ack 3 10 b = fac 42 c = fib 35 fac 0 = 1 fac n = n * fac (n-1) ack 0 n = n+1 ack m 0 = ack (m-1) 1 ack m n = ack (m-1) (ack m (n-1)) fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2) 解决方法
您可以在Scala中翻译您的示例,如下所示:
import concurrent.{Await,Future,future} import concurrent.ExecutionContext.Implicits.global import concurrent.duration.Duration object Main extends App { val fac: Int => Int = { case 0 => 1 case n => n * fac(n-1) } val ack: (Int,Int) => Int = { case (0,n) => n + 1 case (m,0) => ack (m-1,1) case (m,n) => ack (m-1,ack(m,n-1)) } val fib: Int => Int = { case 0 => 0 case 1 => 1 case n => fib(n-1) + fib(n-2) } val fa = future { ack(3,10) } val fb = future { fac(42) } val fc = future { fib(35) } val x = for (((a,b),c) <- fa zip fb zip fc) yield (a + b + c) val result = Await.result(x,Duration.Inf) //awaiting synchronously after the result println(s"Value is: $result") } 未来{fib(3,10)}位将创建一个异步计算,它将在不同的执行线程上运行并返回一个Future对象.然后,您可以使用Future.sequence将所有期货组合成一个大的未来,它将提供所有结果的列表. 我们可以将后一个未来的结果映射到结果的总和,从而获得最终值. 在这最后的未来,我们可以做几件事.我们可以进一步组合它,或者我们可以在其上附加回调,或者我们可以在指定的持续时间内同步等待.在我的例子中,我在结果之后以无限的时间段以同步的方式等待. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |