Элементы данных OCaml без инициализации - PullRequest
2 голосов
/ 02 марта 2009

Я хотел бы создать объект с элементом данных, используя OCaml, но не обязательно указывать начальное значение для элемента данных. Многие примеры, кажется, используют список, но я хотел бы использовать один экземпляр типа объекта, который я создал. Это возможно? Спасибо.

class bar = object end;;

class foo =
object (self)
val myDataMember = ((* ??? *) : bar)
end;;

Кроме того, я пробовал ключевое слово option безрезультатно:

class bar = 
object (self) 
    method doIt = Printf.printf "Doing it!"
end;;

class foo bar =
object (self)
  val mutable myDataMember = (None : bar option)
  method get = myDataMember
end;;

let f = new foo (new bar);;
f#get#bar#doIt;;

Здесь компилятор жалуется на то, что элемент данных имеет тип "bar option", когда я хотел указать, чтобы он имел тип bar.

Ответы [ 2 ]

3 голосов
/ 02 марта 2009

Вы должны использовать необязательный тип:

class foo =
object (self)
val myDataMember = (None : bar option)
end;;

конечно, для того, чтобы это можно было использовать, вам, вероятно, придется использовать mutable:

class foo =
object (self)
  val mutable myDataMember = (None : bar option)
  method set t = myDataMember <- (Some t)
  method get () =
    match myDataMember with
    Some x -> x
    None -> failwith "not initialized"
end;;
1 голос
/ 09 марта 2009

F # получить # бар # Doit ;;

Здесь компилятор жалуется на элемент данных с типом "опция бара" когда я хотел указать это иметь Тип бара.

В ответ на ваш новый вопрос. Вы не указали, что он имеет тип bar, вы указали, что он имеет bar option (именно тогда, когда вы набрали (None : bar option)). Чтобы получить доступ к этому, вам нужно сопоставить - это может быть лучше в методе get, но точка верна.

match f#get#bar with
  | Some x -> x#doIt
  | None -> failwith "value not initialized"

Я не знаю, что вы имели в виду bar, когда писали, class foo bar, но это аргумент для класса foo (функциональный объект) и не имеет ничего общего с классом bar. Взгляните на определение типа foo.

'a -> object val mutable data : bar option method get : bar option end

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

class bar = object (self)
    method doIt = Printf.printf "Doing it"
end

class foo (arg1:bar) = object (self)
    val mutable data = arg1
    method get = data
    method set new_data = data <- new_data
end
...