3章評価戦略

評価戦略、あるいは単に戦略とは、並列性からアルゴリズムを分離して並列コードをモジュール化する手法のことです。ときにはアルゴリズムを書き換える必要がありますが、一度書き換えてしまえば、新しい戦略に置き換えるだけで別の並列化が可能になります。

具体的には、StrategyEvalモナド内の関数で、引数として型aの値を取り、同じ値を返します†1

[†1] 訳注:出力のEvalモナドが保持する値は、入力の値と同じであることに注意して下さい。

type Strategy a = a -> Eval a

Strategyのアイディアは、入力としてあるデータ構造の値を取り、rparおよびrseqを使って並列性を生成しながらこれを走査し、結果として元と同じ値を返すことです。

以下に簡単な例を示します。組の2つの要素を並列に評価するStrategyを作ってみましょう。目標は、次の型を持つ関数parPairです。

parPair :: Strategy (a,b)

先に示したStrategy型の定義によれば、この型は(a,b) -> Eval (a,b)と同じだとわかります。parPairは組を取り、Evalモナド内で何らかの計算をし、その組を返します。以下がその定義です。

strat.hs

parPair :: Strategy (a,b)
parPair (a,b) = do
  a' <- rpar a
  b' <- rpar b
  return (a',b')

これは「2.2 Evalモナド、rpar、rseq」で説明したrpar/rparパターンに似ています。違いは、1つのStrategyに梱包したところです。データ構造(この場合は組)を取り、rparを使って何らかの並列性を生成してから、同じデータ構造を返します。 ...

Get Haskellによる並列・並行プログラミング now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.