"JavaでFree Monad"をF# に移植してみた

JavaでFree Monad - scalaとか・・・

上記記事で紹介されているFree Monad in Java*1をF#に移植してみた。

https://github.com/pocketberserker/free-monad-fsharp

実用的かどうかとかF#っぽいかなどは置いておくとして、表現できなくもないようである。 実際にTrampolineが表現できている。

以下、元コードとの差異(たぶん)。

  • resume関数は末尾再帰最適化されてるはず
  • 既存のFSharpFuncに_1を追加実装する方法がないので、F0を定義してofFuncとかでしのいでる
  • 一応コンピュテーション式を用意してみた
  • サボっている部分多数

解説とか

後で書くかも(読みたい人はpocketberserkerを急かすと良いと思う)

課題

gosub2 のキャストが怪しい。

https://github.com/pocketberserker/free-monad-fsharp/blob/8a2c068cfbfea727248e5b75f9a5cf54ba864c0a/FSharp.Monad.Free/Free.fs#L48

Free<'F, obj, 'A> で大丈夫だろーとか思ってたけど、フィボナッチ数列を試していたら実行時にキャスト失敗で落ちた。 共変反変の影響かなぁ。