StatefulFuncはなぜ動くのか?


 このページを見ているあなた、きっとオライリーの「Programming F#」を読み進めて、StatefulFunc(stateワークフロー)の理解に躓き、「何でこんなに分からないんだろう」「他の人は理解できているのだろうか」とStatefulFunc(もしくはstateワークフロー、状態ワークフロー、StateBuilder、計算式、コンピュテーション式、計算のビルドなど)というキーワードで検索して、何か情報はないかとここを見ているのではないでしょうか。

 心配要りません。あなたは普通の人です。あの説明で理解できる人は、他の関数型言語(Haskellなど)をすでに十分理解している人だと思います。F#が初めての関数型言語、という人は、あの説明で分からなくてむしろ当たり前です。

「Programming F#」最大のヤマ場「StatefulFunc」

 「Programming F#」のStatefulFuncの説明は正直はしょり過ぎていて、どこか説明をあきらめて投げ出したようなところがあります。日本人で、このStatefulFuncのソースを、予備知識なくこの説明だけで理解できた人はどれだけいるのでしょうか。ほとんどの人が「ふ~ん」と分かったような分からないような気分で読み飛ばしているのではないかと思います。ちなみに、Googleで検索をかけても、日本語のページに限定するとStatefulFuncで有意な情報のページが1件見つかっただけで、StateBuilderでは0件でした。

 ちなみに筆者も、このソースを見て、ペンを片手にどう動いているのかを追いかけてみても分からず、何度も何度も現実逃避をしながら、それでも何度も何度も読み、「実践F#関数型プログラミング入門(日本人の著者による、もう一つの教科書)」を読んだり、Haskellの本を読んだりしながらやっと理解に至りました。

 世の中にこれほどややこしいプログラムがあるのかと。僕がこれを理解した日には、もしかして宇宙人が僕の前に現れて「ようこそ」とか言われてしまうのではないかと思ったりしました。まぁそれほどではないにしろ、このソースが理解できるレベルになれば、一応「F#初段」ぐらいは名乗らせてもらってもいいんじゃないかと思ったほどです。

 で、分かった後で振り返って見ると、「Programming F#」でのStatefulFuncの解説には、理解に必要ないくつかの情報がまったく欠けていると言わざるを得ません。
  1. F#コンパイラが、do!やlet!やreturnをどのように展開するかのルール
  2. F#コンパイラが、不足しているソースを補完するルール
 最低限、この記述がないことには、このプログラムの動きを正確に解釈することは不可能だと思います。それを書かないで、「魔法のような処理が行われて~」なんて書いてるんじゃないよクリスさん!

 思うに、StatefulFuncのくだりは、これを理解させることが目的というより、「こんな不思議なこともできちゃうんだよ~」というのを見せるための単なるデモなのではないかという気がします。

 とはいえ、一つのカスタムワークフローの全メソッドが書かれているサンプルはあまりないので、そこだけ考えてもこの章は貴重と言えるのかもしれません。

「StatefulFunc」理解へのいくつかの道筋


 StatefulFuncを含むワークフロー(モナドとも)を理解する道筋はいくつかあると思いますが、まず最初に「操作的」に手を動かしてプログラムの意味を解きほぐしていくアプローチを取ってみようと思います。この方法は、以下のような方法をとります。
  1. プログラムの中で、関数を呼び出しているところがあったら、その関数呼び出しの部分をその定義と入れ替える。
  2. できた式を整理、簡約する
という操作を繰り返して、式の意味に迫るというアプローチです。

StatefulFunc特有の難しさ


 この方法でStatefulFuncに迫る前に、このプログラムの難しさがどこから来ているのかを考えて見ましょう。
  1. StateBuilder(state)が2段にネストされて使用されているところ
  2. 両方の段に同じStateBuilder(state)を使用するため、GetState、SetStateという関数をかませて半ば無理やり適用させているところ
 僕は正直、このサンプルでStateBuilder(state)を多段にしたことで落伍者を100%以上増やしているのではないかと思います。1段だけにしておいて、先にあげた変換ルールを載せてもらえれば、もっとずっと多くの人が理解できるサンプルになったのではないかと思うのです。
 とはいえ、ワークフロー(モナド)は、関数型言語のトピックの一つとしてこれだけで本が一冊書けそうなほどのボリュームになります。この本のここだけで説明するのをあきらめて、よりトリッキーなコードを見せる方にいってしまったのも仕方ないのかもしれません。

それでは出発


 というわけで、ここからは以下のような段階を追ってStatefulFunc/StateBuilderを読み解く旅に出発します。
  1. Add/Subtract/Multiply/Divideの四つの関数を展開し、その意味を理解する
  2. calculatorActionsを展開し、その意味を理解する
 両方とも、ほとんどがStateBuilderワークフローを展開する作業になるため、前半と後半はほぼ同じ作業になりますので、前半をクリアすれば後半の理解はスムーズに進むはずです。ちなみに、「Programming F#」を持っていないと全く読み進められないので、万一持っていないという場合は本屋へ走って買いに行くか、オンラインでPDFを購入してから以下をクリックしてください。まぁ、持っていない人がここにたどり着くとは思えませんが・・・



今日: -
昨日: -
トータル: -


(文責:片山 功士  2011/12/29)
最終更新:2012年02月03日 01:57