我有一个关于以下最佳方式的问题
我有一个 B 类,我在 B 上有一个组合器,让 foo : B -> int。
我希望 B 类将组合器封装为方法,因此我将其添加为类型扩展。
然后我后来意识到 foo 非常昂贵,并且想通过惰性评估来缓存它的结果
因此,我通过将组合器作为函数传递给构造函数,然后在构造函数中使用 foo = lazy(foo self) 初始化一个字段,从而为系统添加了一个巨大的离合器。
IE
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)
这显然感觉不对
我看到解决此问题的两个选项是 1,创建一个接口并让 foo 继承该接口,2,使所有内容成为静态方法,然后从这些静态方法中创建组合器(与将它们附加到类相反... )
这些都不是很吸引人,我想知道我是否错过了选项 3
哦,我还不能让 let rec 和它一起工作,我也不想因为上面语句中的“某事”依赖于一个依赖于一个函数的函数,这个函数依赖于一个函数( 3深)。
任何意见,将不胜感激