不純/純粋/不純のサンドイッチ
2025-04-08 10:00:25

関数型プログラミングにおけるデザインパターンの一つに、I/O処理などに代表される不純な処理(入力が同じでも出力が異なる場合や、副作用を持つ場合がある処理)をプログラムの最初と最後にまとめ、その間の処理を純粋(同じ入力に対して常に同じ出力を返し、副作用を持たない状態)に保つという考え方があります。 この概念は、以下のように異なる表現で言い表されることもありますが、本質的には同じ内容を指しています。
- 「不純/純粋/不純のサンドイッチ (Impureim Sandwich)」: Mark Seemann(『脳に収まるコードの書き方』著者)
- 「関数型コア、命令型シェル (Functional Core, Imperative Shell)」: Gary Bernhardt(「関数型コア」は、Michał Płachta『なっとく!関数型プログラミング』にも登場)
- 「I/Oや不純なコードをドメインの端に追い出す (Push I/O and impure code to the edges of the domain)」: Scott Wlaschin(『関数型ドメインモデリング』著者)
この「不純/純粋/不純のサンドイッチ」という考え方は、理論上は理解しやすいのですが、実際のプログラムに応用するのは意外に難しい場合があります。 Mark Seemann氏が、そのような実践的な例をいくつかブログ記事にまとめていましたので、それらを日本語に翻訳してご紹介します。