Вы можете прекрасно использовать типы из .Net BCL (библиотеки базовых классов) из F #.Многие из этих типов являются изменяемыми и, следовательно, имеют все связанные с этим издержки и преимущества изменяемых данных.
Хотя можно решить перепроектировать и реализовать неизменяемые версии каждого из этих изменяемых классов, зачастую это слишком много работы.Неизменяемость может быть спектром, а не только всем или ничем, поэтому вы часто будете иметь неизменяемые некоторые основные части вашего алгоритма и структуры данных, но затем будете использовать изменчивость при взаимодействии с различными .Net API, с которыми легко общатьсявеб-сервисы, или пользовательские интерфейсы рисования, или еще много чего.
Тем не менее, среда выполнения F # (FSharp.Core.dll) включает в себя несколько неизменяемых классов коллекций, таких как list , Set и Map (которые, примерно, являются неизменяемыми аналогами классов List, HashSet и Dictionary, найденных в System.Collections.Generic), поскольку часто полезно иметь неизменяемые коллекции, например, для постоянных снимковв многопоточном коде.
С точки зрения «мышления» мне нравится думать об этом как: F # поощряет изменяемое минимизация состояния .Почти каждое значимое приложение обязательно использует какое-либо изменяемое состояние, но если вы сохраняете свои основные структуры данных и алгоритмы в основном свободными от изменяемого состояния, то вы получаете преимущества неизменяемости для основной части вашего кода.F # облегчает получение этого преимущества в основе вашего кода, в то же время облегчая добавление изменяемого состояния либо в «карманы» с областями видимости, либо по краям и границам связи вашего приложения.