Ocaml - Форвардная декларация (Классы) - PullRequest
4 голосов
/ 16 июня 2011

Мне нужно иметь два класса, ссылающихся друг на друга. Есть ли способ в Окамле сделать предварительное заявление одного из них?

(я не думаю, что это возможно, как с более легкими вещами со словом and).

Или, может быть, это возможно, но не так, как я пытался?

Ответы [ 2 ]

7 голосов
/ 17 июня 2011

У 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
2 голосов
/ 18 июня 2011

Или вы можете использовать параметризованные классы . Следуя предыдущему примеру, у вас есть:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...