#functional-programming #ocaml
#функциональное программирование #ocaml
Вопрос:
Почему в Ocaml есть изменяемые массивы? Насколько я понял функциональное программирование, оно заключается в минимизации побочных эффектов. Являются изменяемыми (редактировать:) Массивы не противоречат этой мысли?
Даже строки изменчивы в Ocaml, чего нет даже в python или OCaml не считается чисто функциональным языком?
Комментарии:
1. строки в OCaml неизменяемы по умолчанию начиная с версии 4.06. Я немного смущен использованием термина
mutable lists
в вашем вопросе. Массивы отличаются от List, а списки OCaml неизменяемы.2. Извините, Анураг, я был просто неточен. Спасибо за исправление
Ответ №1:
OCaml не является чисто функциональным языком, это правда. Он имеет чисто функциональное подмножество, но поддерживает мутацию и множество императивных конструкций (а также изменяемые OO-объекты). ИМХО, суть в том, чтобы позволить программистам идти на необходимые компромиссы, обеспечивая при этом отличную поддержку (и своего рода поощрение) функциональному программированию.
Как указывает @AnuragSoni, списки и массивы в OCaml — это разные вещи. Массивы изменяемы, а списки — нет.
На мой взгляд, чисто функциональные массивы довольно проблематичны. По моему (скромному) опыту, они не широко используются, например, в Haskell. Они чистые, да, но недостаточно эффективны для многих целей.
Комментарии:
1. Я думаю, что единственным практическим преимуществом чисто функциональных массивов перед односвязными списками является доступ через индекс, но, как это бывает, людям это требуется гораздо меньше, чем использование / отмена или перемещение по списку.
2. сочетание правильной структуры данных с правильной процедурой может иметь решающее значение!
Ответ №2:
Да, изменяемые массивы противоречат чистому функциональному программированию. Но ocaml — это гораздо больше, чем просто функциональное программирование. Он также обладает множеством императивных и объектно-ориентированных функций.
В отличие от других типов данных, массивы имеют одну главную особенность, которая делает их доступными: произвольный доступ (также называемый прямым доступом) в постоянное время. И это включает в себя как чтение, так и запись. Без изменяемых массивов было бы невозможно иметь структуры данных с произвольным доступом, записываемые в постоянное время. Это важно, например, для хэш-таблиц или куч.
Теперь было бы неплохо иметь неизменяемые массивы и изменяемые массивы, и это можно легко реализовать с фантомными типами таким образом, чтобы функция, ожидающая неизменяемый массив, также принимала изменяемый массив, но не наоборот.
Но основной язык ocaml исторически вырос, чтобы включать в себя все необходимое для интерпретатора / компилятора ocaml и немного больше. Не было необходимости иметь неизменяемые массивы, но были нужны изменяемые. Итак, был реализован прямой тип изменяемого массива. Его легко расширить до изменяемых / неизменяемых массивов, но это оставлено для расширений стандартной библиотеки.
Примечание: кортежи — это своего рода неизменяемые массивы. Но у них фиксированный размер во время компиляции и нет оператора индексации.
Примечание2: ocaml начинался с изменяемых строк. Спустя много-много лет и совсем недавно это было изменено на Bytes (изменяемый) и String (неизменяемый). К сожалению, не с фантомными типами, поэтому они не взаимозаменяемы.