F#中的循环函数/类型依赖
我有一个问题,关于以下的最佳方式
我有一个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)
这显然是错的
我看到修复它的两个选项是1,创建一个接口并让foo继承该接口,2,使所有东西成为静态方法,然后用这些静态方法组合组合(与将它们附加到类相反的方式... )
这些都不是很吸引人,我想知道我是否错过了选项3
哦,我还没有能够让rec和它正常工作,我也不会真的想在上面的语句中“某事”取决于依赖于函数的函数的函数( 3深)。
任何意见,将不胜感激
没有找到相关结果
已邀请:
2 个回复
外镶受继
以及类型的扩展名,那么F#会将定义的两个部分组合成一个.NET类型。因此,它在两个独立的部分中定义的事实只是一个实现细节。 如果您不想公开带有组合子的构造函数,可以将其标记为
。再加上一些额外的更改(即使用隐式构造函数语法),代码段如下所示:
如果你想把
作为一个单独的功能,那么这是一个很好的解决方案。 F#PowerPack中的许多数字类型都遵循此模式(请参阅复数的定义)
翰冒绢县
类型可以使用自己的静态成员递归,因此这是编写代码的更简单方法。