次の例では、関数 par は計算のペアをパラメータとしてとり、計算結果を別のペアで返します。2つの計算は並列実行されます。
この関数はオブジェクト scala.concurrent.ops において、次のように定義されています。
def par[A, B](xp: => A, yp: => B): (A, B) = {
val y = new SyncVar[B]
spawn { y set yp }
(xp, y.get)
}
同じ場所で replicate 関数が定義されていて、多数の計算の複製を並列実行しま す。各複製インスタンスには、それを識別する整数値が渡されます。
def replicate(start: Int, end: Int)(p: Int => Unit) {
if (start == end)
()
else if (start + 1 == end)
p(start)
else {
val mid = (start + end) / 2
spawn { replicate(start, mid)(p) }
replicate(mid, end)(p)
}
}
次の関数は、配列のすべての要素について並列計算を実行するために、replicate を使っています。
def parMap[A,B](f: A => B, xs: Array[A]): Array[B] = {
val results = new Array[B](xs.length)
replicate(0, xs.length) { i => results(i) = f(xs(i)) }
results
}