Вопрос

Существуют ли какие-либо серьезные научные математические библиотеки, созданные с использованием функциональных языков программирования?Исходя из самой природы функциональных языков, можно было бы подумать, что они особенно подходят для математики, но все же хорошо известные алгоритмы кажутся процедурными.

Например, классический Числовые Рецепты сериал написан в значительной степени процедурно. ЛАПАК является почти стандартом де-факто во многих областях, но он написан на Fortran и, следовательно, процедурный или, возможно, OO, но определенно не функциональный.

Кто-нибудь смог перенести такого рода хорошо известные процедурные алгоритмы в функциональный стиль?

Обновить:похоже, что функциональные языки используются в символический расчеты, напримерв Mathematica.Но есть ли что-то по своей сути несовместимое с числовой вычисления и функциональные алгоритмы?Или это просто потому, что императивные алгоритмы были изобретены первыми, и никто не потрудился придумать функциональные эквиваленты?

Это было полезно?

Решение

В HackageDB есть библиотека Haskell для числовых данных: матрица.Он взят из LAPACK, BLAS и GSL (Научная библиотека GNU).

Но вы должны иметь в виду, что императивные алгоритмы могут быть легко перенесены на чисто функциональные языки с использованием монад (более конкретно, преобразователей состояний).Фактически, любая эффективная реализация на месте, как правило, должна использовать такой механизм для предоставления изменяемых переменных на чисто функциональных языках.

Что касается следования функциональному стилю, то во многих случаях это невозможно.Для многих задач не известно никаких (эффективных) функциональных подходов.Конечно, вы можете заставить такие алгоритмы работать, например, на Haskell, но они не будут сильно отличаться от того, если бы были написаны на Matlab, Fortran или C.

Редактировать:

Это и то, и другое очевидный несовместимость, а также проблема, которая возникла первой:

  1. Эффективные численные алгоритмы обычно требуют изменяемых данных.Хотя это возможно в чисто функциональных условиях, это не так просто, как в императивных языках.Но эти две вычислительные модели совершенно эквивалентны.
  2. Базовая машина (например,набор инструкций) всегда был и остается обязательным, за очень немногими исключениями (!).Императивно закодированные алгоритмы легче анализировать и оптимизировать, учитывая способ моделирования реальной машины.
  3. Хотя лежащая в основе математика позволяет относительно легко выводить функциональные решения, вы не получите эффективного алгоритма (точно так же, как в случае вывода императивных решений непосредственно из математики).Поскольку большая часть усилий была и остается направленной на поиск императивных решений, функциональные аналоги просто неизвестны.Под функциональными аналогами я подразумеваю код, который должным образом выражает функциональное намерение и стиль.
  4. Существует довольно много императивного кода, который можно использовать повторно.Многое из этого можно перевести на функциональный язык с помощью преобразователей состояний, хотя это все равно выглядело бы обязательным.

Я действительно думаю, что чисто функциональный язык, такой как Haskell, мог бы быть полезен для кодирования алгоритмов:можно было бы объединить математическое описание, сам алгоритм и какое-то доказательство, ориентированное на тип (т. е.используя Изоморфизм Карри-Говарда) в том же фрагменте кода.

Другие советы

Я бы использовал LAPACK как черный ящик функционального языка, а не пытался его переписать.LAPACK был протестирован, доработан, оптимизирован и т. д.на протяжении десятилетий некоторыми чрезвычайно умными людьми.Я бы не трогал это.

В духе отличного Структура и интерпретация компьютерных программ, Есть также Структура и интерпретация классической механики.В этой книге схема используется для пояснения множества расплывчатых математических обозначений, используемых в вариационном подходе к механике.

Краеугольным камнем книги является scmutils упаковка, который включает функциональный подход к решению многих вычислительных задач, таких как интеграция и минимизация.

Отличный вопрос!

Я являюсь одним из немногих пионеров в этой области уже несколько лет, и только недавно мы достигли точки, когда можно одновременно получить производительность, подобную Фортрану, и краткость, подобную Python, для широкого круга задач.Подробно изучив все доступные функциональные языки и их реализации, я решил сосредоточить свои усилия на статически типизированных нечистых функциональных языках:открытый исходный код Язык программирования OCaml и Язык программирования F# от Microsoft. для .NET.

Моя книга OCaml для ученых охватывает научные вычисления с Язык программирования OCaml используя Linux или Mac OS X.Моя книга F# для ученых охватывает научные вычисления с Язык программирования F# от Microsoft. с использованием Windows и Visual Studio.Моя компания также продает F# для числовых значений и F# для визуализации библиотеки, которые полностью написаны на F# и широко используют функциональное программирование как внутри, чтобы повысить краткость, ясность и удобство сопровождения, так и снаружи, чтобы сделать библиотеку более простой в использовании.Например, первоклассные функции позволяют очень легко строить графики, напримерпостроение синусоидальной функции:

Plot([Function sin], (-5., 5.))

F# для визуализации даже попытается визуализировать любое значение любого типа, поэтому вы можете дать ему матрицу рациональных чисел произвольной точности, и он отобразит результат в виде математического набора.

Мы добились большого успеха в написании кода для научных вычислений в функциональном стиле на языках OCaml и F#.В частности, F# позволяет легко писать высокопроизводительный параллельный код, который является универсальным, без какого-либо снижения производительности из-за абстракции.Таким образом, вы можете реализовать QR-разложение, которое работает для матриц любого типа (одинарной точности, двойной точности, комплексной или даже символьной!) и даже превзойти производительность библиотек, настроенных поставщиком, таких как Intel MKL!

Наконец, я должен отметить, что Mathematica проложила этот путь задолго до меня.Однако их решением было объединить огромную стандартную библиотеку числовых и символьных функций, написанных на C, с традиционным императивным стилем и предоставить довольно элементарный функциональный язык программирования для вызова этих функций.Основным недостатком их подхода является то, что общий код, написанный в системе Mathematica (т.где время не тратится в основном на стандартную библиотеку) примерно в 1000 раз медленнее, чем C.

Несколько систем компьютерной алгебры (например.Maxima) внутренне используют языки на основе LISP для представления символических вычислений/синтаксических деревьев.

Примеры математических, функциональных языков:

http://en.wikipedia.org/wiki/J_(programming_language)

http://en.wikipedia.org/wiki/K_(programming_language)

В любом случае, существует несколько математических задач и алгоритмов, которые невозможно хорошо и эффективно сформулировать в функциональном стиле.Эффективное внедрение всегда будет императивом.Бывший:Решето Эратосфена

Я считаю, что Mathematica использует свой собственный функциональный язык.

Дайте определение «серьезный».Помните, что функциональные языки (кроме LISP) довольно новы — оригинальные статьи Бэкеса были выпущены только в конце 70-х годов, а функциональные языки производственной инженерии — совершенно новы.Все хорошо известные и широко принятые численные пакеты основаны на алгоритмах и кодах, появившихся в конце 60-х и начале 70-х годов. БЛАС впервые был опубликован в 1979 году.Поскольку при промышленном использовании люди склонны тяготеть к хорошо известным и проверенным пакетам, существует большая тяга к старым кодам FORTRAN.

Но наверняка есть люди, выполняющие числовую обработку с помощью функциональных языков.Как указано в другом ответе, Mathematica все чаще становится функциональным числовым языком и все чаще реализуется сама по себе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top