ワークフローの図的な理解
ワークフローというか、モナドの説明にはいろいろあって、いろいろあるからこそ、色んな人の沢山の捉え方を読むことができ、それを横断的に目を通すことでワークフロー(モナド)を立体的に捉えることができるのだと思います。インターネット上にも沢山の人が自分の言葉でモナドの説明を試みています。
そういうものをこれまで沢山見てきてお世話になったので、僕は僕なりの現在の理解を図にしてみました。
関数が二つ連続する場合
まず、単純に二つの関数を連結した式を考えます。
let test =
let x = funcA
funcB x
もしくはもっと単純に
let test = funcA |> funcB x
でもいいでしょう。
これと等価なワークフローを作ってみます。この際testworkflowが何なのかは気にする必要がありません。
let test =
testworkflow {
let! x = funcA
do! funcB x
}
この式の糖衣構文を展開すると、以下のようになります。
let test =
testworkflow.Bind(funcA,
(fun x -> funcB x)
この二つの式の違いは何なのでしょうか?
図にしてみました。
イメージとしては、水が流れているホースを途中(funcAとfuncBの間)でぶった切り、funcAの出口と、残りのホースをBindという箱に突っ込んだ状態です。
Bindの中ではfuncAから流れてくる戻り値に対し、その型(というかパターンマッチ)に応じて間に挟む処理をし、同時に渡された「残りの処理ホース」の入り口側に処理結果を流し込んで、その出口から出てきたものを自分の戻り値にする、というような処理が行われます。
行が3行以上あった場合は、restOfComputationの中でさらに同じような「ぶったぎり処理」が再帰的に行われます。
この、「プログラムを関数と関数の間でスパッと切って、切断面より前の処理の戻り値と、それ以降の処理全部を引数に受ければやりたいことはできるはず」という感覚がワークフローの基本的な考え方なのだと思います。
(文責:片山 功士 2012/01/01)
今日: - 人
昨日: - 人
トータル: - 人
最終更新:2012年02月03日 01:58