「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に関してはラムダ式で対応させました。
型は…このあたりはまだ頑張って書いてますね。
もう少し使用例
- BinaryValueはレコードとして定義
- printResultは型パラメータ書くのがだるかったので型推論に身をゆだねることに
- ScalaのidentityはF#のid
- Basis.Core便利です see. .NETの標準ライブラリと仲良くする話 - ぐるぐる~
- パイプライン演算子がぽぽぽぽーん
「ルールは大事よね」
朝眠かったので飛ばしました。そのうち別記事でなんとかしたい。
call/cc
特になし。
おまけ
とりあえずコンピュテーション式を定義してみました。
まとめ
今回はわりと素直にScalaからF#に移植できましたね。めでたしめでたし。