Основной вопрос OCaml ООП - PullRequest
3 голосов
/ 26 января 2009

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

class myClass2 =
object
 method doSomething = Printf.printf "%s\n" "Doing something"
end;;

class myClass foo =
object
 val dMember = foo
 method doIt = dMember#doSomething
end;;

let mc2 = new myClass2;;
let mc = new myClass mc2;;
mc#doIt;;

Ошибка, которую я получаю при попытке скомпилировать программу:

File "sample.ml", line 6, characters 5-84:
Some type variables are unbound in this type:
  class myClass :
    (< doSomething : 'b; .. > as 'a) ->
    object val dMember : 'a method doIt : 'b end
The method doIt has type 'a where 'a is unbound

Мне особенно интересно, почему:

val dMember = foo
method doIt = dMember#doSomething

недействительно. Любая (и я имею в виду любая ) помощь приветствуется.

Ответы [ 2 ]

6 голосов
/ 26 января 2009

Объекты OCaml не могут иметь свободные переменные типа в своих сигнатурах. Поскольку тип аргумента foo не указан полностью, необходимо параметризовать myClass с помощью свободных переменных типа foo.

class ['a] myClass foo =
object
 val dMember = foo
 method doIt : 'a = dMember#doSomething
end;;

Это определение имеет тип

class ['a] myClass :
  (< doSomething : 'a; .. > as 'b) ->
  object val dMember : 'b method doIt : 'a end

Это похоже на обычные параметризованные типы данных, например, 'a tree (квадратные скобки вокруг 'a - лишь небольшая часть синтаксического смещения). Обратите внимание, что 'a является типом foo#doSomething, а не foo.

# let x = new myClass (new myClass2);; 
val x : unit myClass = <obj>
# x#doIt ;;
Doing something
- : unit = ()
1 голос
/ 26 января 2009

Объявите тип:

class myClass (foo:myClass2) =
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...