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深)。 任何意见,将不胜感激     
已邀请:
我认为您当前的设计没有任何问题。关键是如果你在同一个文件(和同一个模块)中定义类型
Foo
以及类型的扩展名,那么F#会将定义的两个部分组合成一个.NET类型。因此,它在两个独立的部分中定义的事实只是一个实现细节。 如果您不想公开带有组合子的构造函数,可以将其标记为
private
。再加上一些额外的更改(即使用隐式构造函数语法),代码段如下所示:
type Foo private (comb) as self =
  let x : Lazy<int> = lazy comb self

let something (x:Foo) = 1

type Foo with
  new() = Foo(something)
如果你想把
something
作为一个单独的功能,那么这是一个很好的解决方案。 F#PowerPack中的许多数字类型都遵循此模式(请参阅复数的定义)     
我不太了解你所追求的是什么,但我认为这可能会有所帮助:
type foo(comb) as self =
    let x = lazy(comb self)
    static member something (x:foo) = 1 
    new() = foo(foo.something)
类型可以使用自己的静态成员递归,因此这是编写代码的更简单方法。     

要回复问题请先登录注册