Синтаксис OCaml для передачи пользовательских объектов в качестве параметров - PullRequest
4 голосов
/ 02 февраля 2009

Я пытаюсь понять синтаксис языка OCaml, и у меня возникли проблемы с применением некоторых структур ООП. Моя цель с приведенным ниже кодом состоит в том, чтобы иметь панель классов, которая наследуется от виртуального класса foo. Виртуальный класс содержит три виртуальных метода, которые я надеюсь использовать в качестве параметра экземпляр объекта «player». Когда я компилирую приведенный ниже код, я получаю сообщение об ошибке: метод doThis имеет тип 'a ->' b, но ожидается, что он будет иметь тип player. Что это значит (помните, я новичок в этом) и как мне исправить это?

Спасибо!

class player =
object

end;;

class virtual foo =
object (self)
 method virtual doThis : player
 method virtual doThat : player
 method virtual notifyAll : player array
end;;

class bar (playersIn: player array) =
object (self)
 inherit foo
 method doThis (p:player) = Printf.printf "%s\n" "This!"
 method doThat (p:player) = Printf.printf "%s\n" "That!"
 method notifyAll (p:player array) = Printf.printf "%s\n" "Notifying!"
end;;

Ответы [ 2 ]

2 голосов
/ 02 февраля 2009

(я не знаю OCaml, но я знаю F #, и они похожи, так что, надеюсь, я угадаю.)

Попробуйте изменить

method virtual doThis : player 
method virtual doThat : player 
method virtual notifyAll : player array

до

method virtual doThis : player -> unit
method virtual doThat : player -> unit
method virtual notifyAll : player array -> unit
1 голос
/ 08 февраля 2009

Я полагаю, что предыдущий ответ на этот вопрос правильный: для рассматриваемых методов их типы должны быть функциями, возвращающими единицу.

Еще один, более общий совет: не начинайте изучать OCaml, начав изучать объектную систему. Объекты в OCaml могут быть полезны, но случаи, когда вы действительно хотите программировать с объектами, немногочисленны. И вы не сможете понять объектную систему OCaml, пока не овладеете базовым языком. Сосредоточьтесь на том, как решить ваши проблемы, используя основные алгебраические типы данных (варианты, кортежи, записи), обычный параметрический полиморфизм (в отличие от подтипа, который вы видите с полиморфными вариантами и объектами) и модули (но не функторы).

Получите представление об этих основных инструментах, прежде чем играть с объектами. Большинство проблем, которые вы решите с объектами на других языках, лучше всего решаются в OCaml без них.

...