Отличный вопрос!
Я являюсь одним из немногих пионеров в этой области уже несколько лет, и мы только недавно достигли того уровня, когда стало возможным получить производительность, подобную Fortran, и краткость, подобную Python, для широкого диапазона проблемы. Подробно изучив все доступные функциональные языки и их реализации, я решил сосредоточить свои усилия на нечистых функциональных языках статического типа: с открытым исходным кодом язык программирования OCaml и язык программирования Microsoft F # для .NET.
Моя книга OCaml для ученых охватывает научные вычисления с помощью языка программирования OCaml для Linux или Mac OS X. Моя книга F # для ученых охватывает научные вычисления с Язык программирования Microsoft F # с использованием Windows и Visual Studio. Моя компания также продает F # для числовых и F # для библиотек визуализации , которые полностью написаны на F # и широко используют функциональное программирование как для краткости, ясности и удобства обслуживания, так и для внешних целей. сделать библиотеку проще в использовании. Например, первоклассные функции позволяют вам действительно легко строить графики, например, построение функции синуса:
Plot([Function sin], (-5., 5.))
F # для визуализации будет даже пытаться визуализировать любое значение любого типа, поэтому вы можете дать ему матрицу рациональных рациональных чисел, и он будет отображать результат в виде набранной математики .
Мы добились больших успехов в написании кода для научных вычислений в функциональном стиле на языках OCaml и F #. В частности, F # облегчает написание высокопроизводительного параллельного кода, который является универсальным, без потери производительности для абстракции. Таким образом, вы можете реализовать QR-декомпозицию, которая работает для матриц любого типа (одинарная, двойная, сложная или даже символическая!) И даже превосходит производительность библиотек, настроенных производителем, таких как Intel MKL !
Наконец, я должен отметить, что Mathematica пошла каким-то образом, чтобы проложить этот путь задолго до того, как я это сделал. Однако их решение состояло в том, чтобы объединить огромную стандартную библиотеку числовых и символических функций, написанных на C, с традиционным императивным стилем и обеспечить довольно элементарный язык функционального программирования для вызова этих функций. Основным недостатком их подхода является то, что общий код, написанный на Mathematica (т. Е. Где время не тратится в основном на их стандартную библиотеку), примерно в 1000 раз медленнее, чем C.