Ocaml - 前瞻声明(类)

时间:2011-06-16 19:54:24

标签: ocaml

我需要有两个相互引用的课程。在Ocaml有没有办法做出其中一个的前瞻宣言?

(我不认为这可能与单词and更简单的东西一样。)

或许它可能,但与我尝试的方式不同?

2 个答案:

答案 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