Элементы данных OCaml без инициализации

Я хотел бы создать объект с членом данных, используя 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.


person Mat Kelly    schedule 01.03.2009    source источник


Ответы (2)


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

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;;
person Rémi    schedule 02.03.2009
comment
Кажется, у меня проблемы с результатом при использовании ключевого слова option. Я обновил исходный пост. Пожалуйста помоги. Спасибо. - person Mat Kelly; 06.03.2009

f#получить#бар#сделать это;;

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

В ответ на ваш новый вопрос. Вы не указали тип 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
person nlucaroni    schedule 09.03.2009