我需要有两个相互引用的课程。在Ocaml有没有办法做出其中一个的前瞻宣言?
(我不认为这可能与单词and
更简单的东西一样。)
或许它可能,但与我尝试的方式不同?
答案 0 :(得分:7)
Ocaml没有任何类似前向声明的东西(即最终会定义某些内容的承诺),但它具有递归定义(即一组声明然后立即相互定义的事物)。表达式,类型,类和模块之间可以进行递归定义(以及更多);相互递归的模块允许递归地定义混合的对象集。
您可以使用关键字and
:
class foo(x : bar) = object
method f () = x#h ()
method g () = 0
end
and bar(x : foo) = object
method h () = x#g()
end
答案 1 :(得分:2)
或者您可以使用parameterized classes。按照上一个示例,您有:
class ['bar] foo (x : 'bar) =
object
method f () = x#h ()
method g () = 0
end
class ['foo] bar (x : 'foo) =
object
method h () = x#g()
end
推断的界面是:
class ['a] foo : 'a ->
object
constraint 'a = < h : unit -> 'b; .. >
method f : unit -> 'b
method g : unit -> int
end
class ['a] bar : 'a ->
object
constraint 'a = < g : unit -> 'b; .. >
method h : unit -> 'b
end