Действительно ли F # лучше, чем С# для математики?

Несмотря на неуправляемые языки, F # действительно лучше, чем С# для реализации математики? И если это так, почему?

Ответ 1

Я думаю, что большинство важных моментов уже упоминалось кем-то другим:

  • F # позволяет решать проблемы так, как математики думают о них.
  • Благодаря функциям более высокого порядка вы можете использовать более простые концепции для решения сложных задач.
  • Все по умолчанию неизменно, что делает программу более понятной (а также проще распараллеливать).

Конечно, вы можете использовать некоторые из концепций F # в С# 3.0, но есть ограничения. Вы не можете использовать какие-либо рекурсивные вычисления (потому что С# не имеет хвостовой рекурсии), и это то, как вы пишете примитивные вычисления в функциональном/математическом порядке. Кроме того, сложность написания сложных функций более высокого порядка (которые принимают другие функции в качестве аргументов) на С# затруднена, потому что вы должны явно писать типы (в то время как в F # типы выводятся, но также автоматически обобщаются, поэтому вам не нужно явно указывать функция generic).

Кроме того, я думаю, что следующий пункт от Марка Гравелла не является допустимым возражением:

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

Это, конечно, так. Тем не менее, замечательная вещь о F # заключается в том, что вы можете начать писать программу с помощью кортежей и списков голов/хвост, а позже в процессе разработки превратите ее в программу, которая использует .NET IEnumerables и типы со свойствами (и что, как я считаю, типичный F # программист работает *). Кортежи и т.д. И интерактивные инструменты разработки F # дают вам отличный способ быстро прототипировать решения (и при выполнении чего-то математического, это важно, потому что большая часть разработки просто экспериментирует, когда вы ищете лучшее решение). После того, как у вас есть прототип, вы можете использовать простые преобразования исходного кода, чтобы обернуть код inisde F # type (который также можно использовать с С# в качестве обычного класса). F # также дает вам много способов оптимизировать код в дальнейшем с точки зрения производительности.

Это дает вам преимущества простых в использовании langauges (например, Python), которые многие используют для фазы прототипирования. Однако вам не придется переписывать всю программу позже, когда вы закончите прототипирование с использованием эффективного языка (например, С++ или, возможно, С#), поскольку F # является "простым в использовании" и "эффективным", и вы можете свободно переключаться между этими двумя стилями.

(*) Я также использую этот стиль в своей книге функционального программирования.

Ответ 2

F # обладает огромными преимуществами по сравнению с С# в контексте математических программ:

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

  • F # поддерживает некоторые функции, которые могут обеспечить значительное повышение производительности в контексте математики. В частности, сочетание функций inline и более высокого порядка позволяет элегантно учитывать математический код без ущерба для производительности. С# не может выразить это.

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

  • Математические проблемы часто требуют использования более сложных структур данных и алгоритмов. Выражение сложных решений намного проще с F # по сравнению с С#.

Если вы хотите изучить случай, я преобразовал реализацию QR-декомпозиции над System.Double из 2kLOC из С#. F # был только 100 строк кода, работает более чем на 10 × быстрее и обобщается по типу числа, поэтому он работает не только на float32, float и System.Numerics.Complex, но может даже применяться к символическим матрицам для получения символических результаты!

FWIW, я писать книги на эту тему, а также коммерческое программное обеспечение.

Ответ 3

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

Ответ 4

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

Некоторые из предложенных преимуществ F # (неизменяемость, функции более высокого порядка и т.д.) все еще могут выполняться на С# (с использованием делегатов и т.д. для последнего). Это еще более очевидно при использовании С# 3.0 с поддержкой лямбда, что делает его очень легким и выразительным, чтобы объявить функциональный код.

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

Одна из областей, в которых С# позволяет выполнять математику, - это дженерики и их поддержка операторов. Поэтому я трачу некоторое время на это: -p Мои результаты доступны в MiscUtil, с обзором .

Ответ 5

Это сообщение похоже, что это может быть актуально: http://fsharpnews.blogspot.com/2007/05/ffts-again.html

Также: С#/F # Сравнение производительности

Самое большое преимущество для чистой математики - это то, что PerpetualCoder сказал, что F # больше похожа на математическую проблему, поэтому математику легче писать. Это напомнило мне много MATLAB, когда я посмотрел на него.

Ответ 6

Я не уверен, что это лучше или хуже, но, безусловно, есть разница в подходе. Статические языки определяют, как проблема будет решена. Функциональные языки, такие как F # или Haskell, не делают этого и более скроены тем, как математик разрешит конкретную проблему. Тогда у вас есть книги, такие как это, чтобы использовать python для этого. Если вы говорите с точки зрения производительности, ничто не может бить C. Если вы говорите из библиотек, я считаю, что функциональные Langauges (F # и подобные), Fortan (да, еще не мертв), Python имеет отличные библиотеки для математики.

Ответ 7

Одним из важных преимуществ функциональных языков является тот факт, что они могут работать на многопроцессорных или многоядерных системах параллельно, не требуя от вас изменения какого-либо кода. Это означает, что вы можете ускорить свои алгоритмы, просто добавив ядра.