F # затрудняет работу с массивами
F # предоставляет множество функций, облегчающих работу с массивами, чем в других языках, включая литералы массивов, шаблоны массивов и функции высшего порядка.
Вопрос, который сразу всплыл в голову: разве не легко предсказать и добавить что-то, что следует осудить на неизменном языке?
Я полагаю, вы неправильно поняли, что означает это утверждение. Когда люди говорят о добавлении и добавлении в контексте чисто функциональных структур данных, они имеют в виду создание новой коллекции, которая является производной (и разделяет большинство ее внутренних элементов) с существующей коллекцией.
Так почему же дизайнеры F # предпочитают списки?
F # унаследовал некоторые связанные со списком возможности от OCaml, который унаследовал их от Standard ML и ML, потому что односвязные неизменяемые списки очень полезны в контексте их предметной области (метапрограммирование), но я бы не сказал, что разработчики F # предпочитают списки.
В чем принципиальное отличие неизменяемой среды между списком и массивом?
В F # списки обеспечивают O (1) prepend и append и O (n) произвольный доступ, тогда как массивы обеспечивают O (n) prepend и append и O (1) произвольный доступ. Массивы могут быть изменены, но списки не могут.
Чего мне не хватает?
Базовые знания чисто функциональных структур данных. Читайте Окасаки.
Действительно ли списки в F # связаны между собой?
Да. В частности, односвязные неизменяемые списки. Фактически, в некоторых ML тип list
может быть определен как:
type 'a list =
| ([])
| (::) of 'a * 'a list
Именно поэтому оператор ::
является конструктором, а не функцией, поэтому вы не можете написать (::)
, как вы можете, например, с помощью (+)
.