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