OCaml структурная типизация и списки - PullRequest
2 голосов
/ 02 февраля 2009

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

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

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 ]

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

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

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

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

arrayOfDogs @ [c3]
3 голосов
/ 02 февраля 2009

ваш список должен быть справа, а не слева. То есть:

c3 :: arrayOfDogs;;

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...