У меня есть обучение в семействе языков lisp, и теперь я немного разбираюсь в Haskell для моего же блага. В lisp, функциональный стиль в порядке, но есть несколько случаев , где императивный стиль необходим для достижения достойной производительности, например.Выполнение, связанное с «императивными» алгоритмами в haskell
Append
Append медленно, поскольку он должен скопировать свой первый аргумент (иногда x100 так медленно, как версии, которые добились успеха, чтобы избавиться от него). Средство устранения - , чтобы переместить последний указатель первого списка в начало второго списка вместо добавления. Конечно, это разрушительная операция.
рода
Функциональные варианты сортировки создают множество промежуточных списков, , которые каким-то образом побеждает цель алгоритма, который должен быть как можно быстрее. AFAIR, в общем lisp, sort - единственная деструктивная функция, которая не имеет функциональной версии.
длина
Это дорогостоящая операция в лепет, так как один должен идти вниз весь список, чтобы получить его длину. Этого не должно быть, afaik clojure вычисляет длину списка в логарифмическом времени. Решение часто бывает , чтобы вычислить длину «на лету» в императивном цикле.
Вопрос в том, как мы справляемся с этими проблемами в haskell?
Проблемы, которые вы описываете, как представляется, связаны с плохим выбором структуры данных (списки минусов, где вы должны использовать очереди/deques/etc, структуру данных, которая не поддерживает поле длины, когда вам нужна длина) или алгоритм (quicksort вместо сортировки, которая лучше работает в постоянных списках), а не от функционального стиля. – delnan