Ocaml-转发声明(类)

Ocaml-转发声明(类),ocaml,Ocaml,我需要有两个类相互引用。在Ocaml中是否有任何方法可以对其中一个进行预先声明 (我不认为用word和更简单的东西是可能的) 或者这是可能的,但与我尝试的方式不同?Ocaml没有任何类似于前向声明的东西(即承诺最终会定义某些东西),但它有递归定义(即声明的一块东西,然后根据彼此立即定义)。可以在表达式、类型、类和模块(以及更多)之间进行递归定义;相互递归模块允许递归定义混合对象集 您可以使用带有关键字和的递归定义来解决问题: class foo(x : bar) = object metho

我需要有两个类相互引用。在Ocaml中是否有任何方法可以对其中一个进行预先声明

(我不认为用word
更简单的东西是可能的)


或者这是可能的,但与我尝试的方式不同?

Ocaml没有任何类似于前向声明的东西(即承诺最终会定义某些东西),但它有递归定义(即声明的一块东西,然后根据彼此立即定义)。可以在表达式、类型、类和模块(以及更多)之间进行递归定义;相互递归模块允许递归定义混合对象集

您可以使用带有关键字
的递归定义来解决问题:

class foo(x : bar) = object
  method f () = x#h ()
  method g () = 0
end

and bar(x : foo) = object
  method h () = x#g()
end
或者你可以用。按照前面的示例,您有:

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
class['a]foo:'a->
对象
约束'a='b;。>
方法f:单位->b
方法g:单位->整数
结束
类['a]栏:'a->
对象
约束'a='b;。>
方法h:单位->b
结束

@PawełMechliński:换句话说,您不能编写正向声明,但可以编写递归定义。这是一般性的:Ocaml没有任何类似于前向声明的东西(即承诺最终会定义某些东西),但它有递归定义(即声明的一块东西,然后根据彼此立即定义)。可以在表达式、类型、类和模块(以及更多)之间进行递归定义;相互递归模块允许递归定义混合对象集。解释得不错,Gilles。将其添加到答案中并标记此社区Wiki。此答案实际上比我的更好。不过,如果更改h的名称或类型,您会收到更令人困惑的错误消息。