Действительно ли F # лучше, чем C # для математики? - PullRequest
30 голосов
/ 19 декабря 2008

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

Ответы [ 7 ]

32 голосов
/ 19 декабря 2008

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

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

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

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

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

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

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

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

18 голосов
/ 14 февраля 2010

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

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

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

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

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

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

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

13 голосов
/ 24 декабря 2008

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

7 голосов
/ 19 декабря 2008

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

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

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

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

4 голосов
/ 19 декабря 2008

Это сообщение выглядит как актуальное: http://fsharpnews.blogspot.com/2007/05/ffts-again.html

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

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

1 голос
/ 19 декабря 2008

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

0 голосов
/ 19 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...