「Javaで継続モナド」をF# に翻訳

F# Advent Calendar 20135日目の…記事の予定でした…主催者でありながら大遅刻して申し訳ありません。

ネタは?

@gakuzzzz さんの 「Javaで継続モナド」をScalaに翻訳/Scala Advent Calendar 2013 や、その元ネタである が面白かったため、急きょネタ変更してF#に翻訳したよという内容にしました。
Lensの記事が書きにくかったということでは…すみません、そのうち書きます。

注意事項

  • 文章は限りなく削っているので、先に元記事や元記事の元記事を読むことをお勧めします
  • C#版も作ろうとしましたが、開始5分で気力がつきました

コード

pocketberserker/ContMonadStudy · GitHub

コミットログをおいかけることで、順を追ってコードを読むことができます。
ただし、Basis.Coreを参照に追加した部分でコミット忘れが発生したため(そして今のPCだとrebaseしたらリポジトリが壊れたため)、NuGet周りのコミットだけ後のほうになってしまっています。注意してください。

解説

継続渡し形式とは

特になし。

継続渡し形式のメソッドの関数化

Functionクラスnに関してはラムダ式で対応させました。
型は…このあたりはまだ頑張って書いてますね。

継続渡し形式の関数のクラス化

Scala版ではrunは定義していませんでしたが、F#版ではあったほうが便利なので定義しておきました。
あとはだいたいScala版と同じです。

もう少し使用例
再帰処理の継続モナド

F#もパターンマッチが使えるので値の分解が楽ですね

「ルールは大事よね」

朝眠かったので飛ばしました。そのうち別記事でなんとかしたい。

call/cc

特になし。

おまけ

とりあえずコンピュテーション式を定義してみました。

まとめ

今回はわりと素直にScalaからF#に移植できましたね。めでたしめでたし。