2章基本の並列性:Evalモナド
この章ではHaskellのコードに並列性を追加するための基礎を解説します。まずは遅延評価に関する背景知識から始めて、それから次の節「2.2 Evalモナド、rpar、rseq」で、並列性をどのように使うのかを説明していきます。
2.1 遅延評価と弱頭部正規形
Haskellは遅延言語です†1。これは、式はそれが必要とされるまで評価されないことを意味します。通常は、これがどのように振る舞うのかをあまり深く考える必要はありません。必要とされたときに式が評価され、そうでなければ式が評価されない。それで十分だからです。しかし、コードに並列性を加えようとすると、コンパイラに対してプログラムがどのように走るべきなのか指示する必要があります。同時に実行すべき部分があるはずだからです。並列性を効率的に利用できるようにするためには、遅延評価の動作についての直観が役に立つので、この節では基本的な概念をGHCiを用いて説明していくことにします。
[†1] 技術的にはこれは正確な表現ではありません。Haskellは実際には非正格言語であり、遅延評価はそれを実現するための有効な実装戦略の1つに過ぎません。しかし、GHCは遅延評価を採用しているので、ここではこの技術的違いを無視することにします。
とても簡単な例から始めましょう。
Prelude> let x = 1 + 2 :: Int
これは変数x
を、式1 + 2
(多重定義による混乱を防ぐため、型Int
を注釈)に束縛します。1 + 2
は3
に等しいので、let x = 3 :: Int
とも書けます。これら2つの違いは、普通のHaskellのコードでは見分けることができません。しかし、並列性の目的から言えば、1 + 2 ...
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.