【GoF】デザインパターン5

このエントリーをはてなブックマークに追加
312デフォルトの名無しさん
>>181の訳

Monadicプログラミング・パターン

「Monadicプログラミング」とは、(関数言語の文脈で)Monadが理論化されるずぅっと前から(訳注1:未確認…)、関数言語プログラマが使っていた半ば常識的な「デザインパターン」の、
新しい高級な名前に過ぎません。

(状況を説明するために)
とりあえず複数のコマンド列を実行する関数が欲しいと仮定します。
しかし困った事に(副作用のない純関数言語の)関数では、単に(何らかの式を)評価(evaluate)して純粋な値(pure value)を返す事しかできません。
あなたがすべきなのは、評価結果として実行したい複数のコマンド列に相当する「単一の値(a value)」を返すような関数を得る事です。

そんなわけで(純関数言語におけるMonadicプログラミングの)デザインパターンは、
  各関数は通常の引数/戻り値の他に状態値(state value)を受け渡す、
という内容になります。
ただしこのパターンにはいくつかの制約が課せられており、例えばその一つはこうです:各状態値は、ただ一度だけしか使ってはならない

コマンド列を順次実行するには、各コマンドを関数化して、引数として現在のWorld's stateを受け取り、戻り値としてコマンド実行後のWorld's stateを返すようにする必要があります。
例えば2つのコマンドの順次実行は、最初の関数から次の関数への状態受け渡しとなります。

Monadについて考える場合には、他にもいろいろ追加すべき要素があります。。。

そしてこの「デザインパターン」は、圏論(Category Theory)として知られる数学の一分野に由来する数学概念であり、この概念は圏論で「Monad」と呼ばれている事が判明します。

原文脚注:圏論とは、言わば数学的なデザインパターンの研究です。
実際はそれ以上のものなんだけど、とりあえずコンピュータ・サイエンティストが圏論を研究する時に、このような考え方が良い直観を与えます。

(訳注2: 本文後半、数学概念の説明に関して、後続レスで議論あり)
313デフォルトの名無しさん:2005/06/21(火) 12:36:47
再利用技術を否定するアンチ君はきっと、
受注したシステムの著作権ごと売り渡してしまい
毎回1から作り直してる零細ソフトハウスにお勤めなんだろう。
314Ocamlとデザインパターン:2005/06/21(火) 12:36:51
OCaml and Design Patterns
    [Caml-list] OCaml and Design Patterns , 2004-10
      http://caml.inria.fr/pub/ml-archives/caml-list/2004/10/a5a65e58429e3175fee88dfb7e06c135.en.html
      http://caml.inria.fr/pub/ml-archives/caml-list/2004/10/503304c95e2ccd073b446a2d57d8e326.en.html
      http://caml.inria.fr/pub/ml-archives/caml-list/2004/10/20a3988025ff8e418742124059d1a89a.en.html

[生成に関するパターン]
Abstract Factory
    [comp.lang.ml] Abstract Factory in OCaml (was Re: record vs. class?) , 2004-10
      http://groups.google.co.jp/group/comp.lang.ml/browse_thread/thread/37033101d734c2cc/5055cddf67f8f817#5055cddf67f8f817
Builder
    ([Haskell] how to write a list builder? fixpoint? , 2004-06)
      http://www.haskell.org/pipermail/haskell/2004-June.txt
Factory Method
    [ocaml_beginners] Re: Matching on objects , 2002-02
      http://caml.inria.fr/pub/ml-archives/ocaml-beginners/2002/02/61cda1dab8aeda9996b97cd479ebcea9.en.html
Prototype
    未
Singleton
    [Caml-list] How to implement "Singleton" design pattern? , 2002-08
      http://caml.inria.fr/pub/ml-archives/caml-list/2002/08/cc5cc0c6d5c3d741fda2283751f89dfd.en.html

[振る舞いに関するパターン]
Observer
    OCamlマニュアル 5.3章に、Observerパターンの説明がある。
      http://caml.inria.fr/pub/docs/manual-ocaml/manual007.html#htoc49

以下、未

[構造に関するパターン]
    未
315デフォルトの名無しさん:2005/06/21(火) 12:42:20
結論1: オブジェクト指向拡張のなされた関数言語 (OCaml)とデザインパターンは両立しうる (>>314)
結論2: 関数言語の世界でも、熟練したプログラマーが使うノウハウは
     イディオム、デザインパターン、プログラミングスタイルなどと呼ばれる形で蓄積されている。
     例えば純関数型言語Haskellを特徴づける Monadicプログラミングも、その一例である。
結論3: デザイン・パターンを「設計上よくあらわれるパターン」という一般概念として考える場合、
     それは全てのプログラム開発で発生する事象である。
     デザイン・パターンなど必要ないという人物は、単にプログラミングをした事がないだけである。