"JavaでFree Monad"をF# に移植してみた
上記記事で紹介されているFree Monad in Java*1をF#に移植してみた。
https://github.com/pocketberserker/free-monad-fsharp
実用的かどうかとかF#っぽいかなどは置いておくとして、表現できなくもないようである。 実際にTrampolineが表現できている。
以下、元コードとの差異(たぶん)。
- resume関数は末尾再帰最適化されてるはず
- 既存のFSharpFuncに_1を追加実装する方法がないので、F0を定義してofFuncとかでしのいでる
- 一応コンピュテーション式を用意してみた
- サボっている部分多数
解説とか
後で書くかも(読みたい人はpocketberserkerを急かすと良いと思う)
課題
gosub2 のキャストが怪しい。
Free<'F, obj, 'A> で大丈夫だろーとか思ってたけど、フィボナッチ数列を試していたら実行時にキャスト失敗で落ちた。 共変反変の影響かなぁ。