2009-02-02 4 views
2

У меня проблемы со списками в OCaml. Я читал противоречивые утверждения о том, можно ли изменить списки во время выполнения. Можно ли использовать оператор cons во время выполнения?OCaml структурная типизация и списки

Кроме того, почему doberman (см. Ниже) разрешено находиться в списке чихуахуа? Как можно было бы добавить еще один чихуахуа в список (как пытались с последней строкой)?

class virtual dog = 
object 
method virtual bark : unit 
end;; 

class chihuahua = 
object 
inherit dog 
method bark = Printf.printf "Yip!" 

end;; 

class doberman = 
object 
inherit dog 
method bark = Printf.printf "Roar!" 

end;; 

let c1 = new chihuahua;; 
let c2 = new chihuahua;; 
let c3 = new chihuahua;; 
let d1 = new doberman;; 

let arrayOfDogs = [c1;c2;d1];; 
arrayOfDogs :: c3;; 

ответ

3

необходимо, чтобы у вас был список справа, а не слева. То есть:

c3 :: arrayOfDogs;; 

Именно поэтому последняя строка терпит неудачу.

Что касается построения списка, учитывая, что OCaml является типом, интерпретатор, вероятно, выяснил, что вы строите список собак, если вы добавили добермана в строительство. Поэтому это не список чихуахуа.

1

Что сообщает OCaml как тип arrayOfDogs?

Возможно, вы имели в виду: c3 :: arrayOfDogs;;

7

1) Вы можете использовать оператор минусы во время выполнения, он просто возвращает новый список, а не мутирует список ввода.

2) Типы классов в OCaml используют «структурный» подтипирование, а не «стандартное» подтипирование Java-стиля. Выведенный тип arrayOfDogs будет «объектом с методом с именем bark типа unit -> unit (необязательно dog)». Например:

# class cat = object 
    method bark = print_endline "meow" 
    end ;; 
class cat : object method bark : unit end 
# let c = new cat ;; 
val c : cat = <obj> 
# c :: arrayOfDogs ;; 
- : cat list = [<obj>; <obj>; <obj>; <obj>] 

3) Проблема с arrayOfDogs :: c3 это вы получили это неправильный путь вокруг. Тип :: - 'a -> 'a list -> 'a list. Чтобы добавить c3 в начале, используйте

c3 :: arrayOfDogs 

Чтобы добавить его в конце, используйте оператор «добавить» @

arrayOfDogs @ [c3] 
Смежные вопросы