冥冥乃志

ソフトウェア開発会社でチームマネージャをしているエンジニアの雑記。アウトプットは少なめです。

follow us in feedly

モナドって何ですか?先生

GAEを少しやってみたくなって、Pythonを勉強し始めて早一ヶ月が経過しました。
Dive Into Python3を一通りこなした後、Webアプリの開発をしてみようと思ったらメジャーどころのフレームワークはPython3に対応していないと言う罠。だったら、勉強がてら自分で作ってしまえ、と、完全に手段が目的化してしまう本末転倒な状況になっております。

そのフレームワークの詳細な話は別途記事にするとして、テンプレートエンジンを作る段になってプレースホルダのリプレースくらいはなんとかできるものの、ロジックが入ると全くアルゴリズムがわからなくなってしまいました。(正確に言うと思いつかない)
何となくアルゴリズムの参考になるものがないか色々とググってみたところ、面白い記事が。
http://d.hatena.ne.jp/terazzo/20110319/1300563717

関数型のテンプレートエンジンですか。今度、Scalaを勉強するつもりなので予習にはちょうどいいかも、ということでこれをPython3に移植してみることにしました。

ところが、persecというものが必要らしく、それはHaskelのパーサコンビネータのライブラリらしいです。
とりあえず、Pythonでpersecの移植版がないかどうか調べてみたところ、以下のような記事を見つけました*1
Valued Lessons: Pysec: Monadic Combinatoric Parsing in Python (aka Parsec in Python)
元コードがPython2.5系のものだったので、Python3で動くように書き換えました。
勉強がてらコードリーディングもしたので日本語のコメントも入れています。
pysec for Python3k with Japanese comment

出てきました、モナド。未だに良くわかっておりません。
とりあえず、調べたりソースを写経したりしてみてわかったことは、クラスのメソッドを呼ぶと自身の新しいオブジェクトが返ってそれを数珠つなぎにできるっぽいということ。デザインパターンの一種とのこと。

ほんとにこの理解であってるんですか!?先生(誰)
Scala始めて関数脳になったら理解できるようになることを期待します。

*1:記事の本文を翻訳したらpyparsingもpersecと同じ機能を持つライブラリのようですね。実際に使うのはpyparsingにするかも。。。