Аргументы для функционального программирования [закрыто]

10

Недавно я изучал F # для удовольствия (я - разработчик VB.NET/C#), и мне действительно нравится то, что он может предложить. Теоретически это так. Но мне трудно придумать сценарии, в которых я бы выбрал код на F #, а не на C #. Любые идеи?

Система не работает
источник
2
F#не полностью отражает функциональное программирование. Попробуй Clojureвместо этого.
Работа
1
Я не знаю F #, но я использую Haskell всякий раз, когда хочу, чтобы мой ум был взорван. До сих пор работал каждый раз;)
1
infoq.com/presentations/Are-We-There-Yet-Rich-Hickey - отличное видео на эту тему (OO vs. Functional)
mikera
Динамический функциональный язык? Вы можете иметь столько, сколько хотите. : P
Эрик Реппен

Ответы:

14

Несколько аргументов в пользу чисто функционального программирования:

  • Для современных многоядерных систем проще разделять задачи
  • Проще доказать, что ваша программа верна
  • Функциональная композиция может быть удивительной, лаконичной и мощной

Для полной обработки см. Почему вопросы функционального программирования имеют значение и Почему вопросы функционального программирования имеют значение .

Скудный Роджер
источник
6

У меня возникают проблемы с продумыванием сценариев, в которых я бы выбрал код на F #, а не на C #. Любые идеи?

От сюда :

Асинхронные серверы

  • Асинхронные рабочие процессы для асинхронного ввода-вывода.
  • Процессор почтовых ящиков для потоковой передачи сообщений.
  • Типы объединения для состояния сервера и каталога сообщений.
  • Сопоставление с образцом и хвостовая рекурсия для конечных автоматов.

Метапрограммирование (например, разбор)

  • Генераторы парсеров, такие как fslex и fsyacc.
  • Парсер комбинаторы типа FParsec.
  • Активные шаблоны для элегантных парсеров, свернутых вручную.
  • Алгебраические типы данных для представления деревьев разбора.
  • Сопоставление с образцом для управления деревьями, например, применение этапов оптимизации.
  • Отражение для генерации быстрого кода во время выполнения.

Технические вычисления

  • Функции высшего порядка для элегантного и быстрого алгоритмического кода.
  • Алгебраические типы данных и сопоставление с образцом для символьных манипуляций.
  • Совместимость для богатства библиотек .NET.
  • Интерактивность с использованием F # интерактив.
  • Вычислительные выражения для массирования данных.
  • Единицы измерения для улучшения правильности.

GUI приложения

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

Логическое программирование

  • Постоянные коллекции для легкого возврата.
  • Хвост призывает к надежности.
  • Автоматическое обобщение для простого общего программирования.

тестирование

  • Запускайте юнит-тесты в интерактивном режиме.
  • BDD означает написание переводчика.
  • Хороший язык сценариев для написания тестовых наборов и визуализации результатов.

Представление

  • inline для бесплатной абстракции высшего порядка.
  • Хвост призывает к быстрым конечным автоматам.
  • Чисто функциональные структуры данных для низкой задержки.
  • Метапрограммирование для генерации оптимизированного кода.
Джон Харроп
источник
Я признаю, что я не знаю F # или C #, но я бы посоветовал провести несколько дней в F # и посмотреть, что вы думаете. На мой взгляд, использование REPL является большой победой на любом языке, который его поддерживает
Захари К
5

Вот для чего используется функциональное программирование стилей - более или менее ежедневно.

Мы делаем много статистических и актуарных вещей с довольно большими наборами данных. Данные, извлекаемые из базы данных, - это, по сути, статические неизменяемые объекты. Нет причин создавать класс с методами.

Каждый этап расчета добавляет некоторые дополнительные детали, но по существу не изменяет объект. На «конце» конвейера мы действительно делаем причудливое сокращение для вычисления сумм и подсчетов и других вещей.

Представь себе это.

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

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

(Мы используем Python, следовательно, функциональное программирование с использованием функций генератора.)

Проще использовать неизменяемые, неизменяемые объекты.

С. Лотт
источник
Есть ли у Python эквивалент этому F #? criteria() |> some_query |> calculate |> enrich |> summarizeЯ считаю, что оператор прямого канала может привести к более ясному коду, но я отвлекся.
ChaosPandion
@ChaosPandion: Во-первых, этот синтаксис смущает меня. Но некоторым людям это нравится. Там бесчисленные пакеты Python. Я уверен, что вы можете найти это на SO и найти ответ.
S.Lott
@ Чаос: Не то, что я знаю. обычно я сочиняю, mapчтобы получить тот же эффект.
Пол Натан
4

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

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

SK-логика
источник
2

Идеально подходит для масштабного многосистемного параллельного параллелизма с уменьшением количества карт. Довольно круто, учитывая, что в настоящее время серверы начального уровня поставляются с 48 ядрами (96 считая HT).

Vartec
источник
2

Если вы хотите полностью функциональный, попробуйте Haskell, у Erlang также есть несколько очень интересных вещей.

Саймон Пэйтон-Джонс сказал о Хаскелле, он хочет иметь программу, в которой явно нет ошибок, а не очевидных ошибок.

(Я, вероятно, получил немного цитату, но вы поняли идею)

Ограничивая побочные эффекты, вы значительно облегчаете проверку правильности своего кода.

Захари К
источник
1

Одно определенное преимущество состоит в том, что это намного легче распараллелить

biziclop
источник
2
Вы говорите о чистоте, и одним очевидным недостатком является то, что чистота делает программы намного медленнее. Так что параллель + чистый не обязательно хорошая вещь.
Джон Харроп