次のことについて最善の方法について質問があります
クラス B があり、B にコンビネータがあり、foo : B -> int とします。
クラス B にメソッドとしてカプセル化されたコンビネータを持たせたいので、型拡張で追加します。
私は後で foo が非常に高価であり、遅延評価で結果をキャッシュしたいことに気付きました
そのため、コンビネーターを関数としてコンストラクターに渡し、コンストラクターで foo = lazy(foo self) を使用してフィールドを初期化することで、システムに巨大なクラッチを追加します。
すなわち
type foo =
class
val x : int Lazy
new (comb) as self = {x=lazy(comb self);}
end
let something (x:foo) = 1
type foo with
new() = foo(something)
これは明らかに気分が悪い
これを修正するために私が見る2つのオプションは、1、インターフェースを作成し、fooにそのインターフェースを継承させる、2、すべてを静的メソッドにしてから、それらの静的メソッドからコンビネーターを作成することです(クラスにアタッチするのとは逆のようなものです... )
これらはどちらも非常に魅力的ではなく、オプション 3 を見逃したのではないかと思っていました。
ああ、私は let rec を取得できず、これをうまく処理できませんでした。また、上記のステートメントの「何か」は、関数に依存する関数に依存する関数に依存するので、本当にしたくありません( 3 深さ)。
アドバイスをいただければ幸いです