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


10

Нещодавно я вчився F # для розваги (я VB.NET/C# dev), і мені дуже подобається щось із того, що він може запропонувати. Теоретично це так. Але у мене виникають труднощі при розробці сценаріїв, де я б вирішив кодувати в F #, а не в C #. Будь-які ідеї?


2
F#не є повністю представником функціонального програмування. Спробуйте Clojureзамість цього.
Робота

1
Я не знаю F #, але я використовую Haskell всякий раз, коли хочу, щоб мій розум роздувся. Працював кожен раз до цих пір;)

1
infoq.com/presentations/Are-We-There-Yet-Rich-Hickey - чудове відео на цю тему (OO vs. Functional)
mikera

Динамічна функціональна мова? Ви можете мати скільки завгодно. : P
Ерік Reppen

Відповіді:


14

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

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

Для повного лікування див. Чому важливі питання функціонального програмування та чому значення функціонального програмування .


6

У мене виникають труднощі при розробці сценаріїв, де я б вирішив кодувати в F #, а не в C #. Будь-які ідеї?

Від сюди :

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

  • Асинхронні робочі процеси для асинхронного вводу-виводу.
  • Процесор поштової скриньки для безпечного передачі потоку повідомлень.
  • Типи об'єднання для стану сервера та каталогу повідомлень.
  • Узгодження шаблонів та рекурсія хвоста для державних машин.

Метапрограмування (наприклад, розбір)

  • Генератори парсера, такі як fslex та fsyacc.
  • Парсер комбінаторів, таких як FParsec.
  • Активні візерунки для елегантних парсерів, що прокатуються вручну.
  • Алгебраїчні типи даних для представлення дерев розбору.
  • Зіставлення шаблонів для маніпулювання деревами, наприклад, застосувати етапи оптимізації.
  • Відображення для швидкого створення швидкого коду.

Технічні обчислення

  • Функції вищого порядку для елегантного та швидкого алгоритмічного коду.
  • Алгебраїчні типи даних та відповідність шаблонів для символічного маніпулювання.
  • Сумісність для багатства бібліотек .NET.
  • Інтерактивність за допомогою інтерактивного F #.
  • Обчислення виразів для масажу даних.
  • Одиниці вимірювання для поліпшення коректності.

GUI-програми

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

Логічне програмування

  • Стійкі колекції для легкого відтворення.
  • Хвіст вимагає надійності.
  • Автоматичне узагальнення для легкого загального програмування.

Тестування

  • Запускайте тести одиниць інтерактивно.
  • BDD означає писати перекладача.
  • Хороша мова сценаріїв для написання тестових джгутів та візуалізації результатів.

Продуктивність

  • inline для безоплатної абстракції вищого порядку.
  • Хвіст викликає швидкі стан машини.
  • Суто функціональні структури даних для низької затримки.
  • Метапрограмування для генерації оптимізованого коду.

Я визнаю, що я не знаю F # або C #, але я б радив провести кілька днів у F # і побачити, що ви думаєте. На мій погляд, використання REPL - це головна перемога на будь-якій мові, яка її підтримує
Zachary K

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

@Chaos: Не те, що я знаю. зазвичай я складаю, mapщоб отримати той самий ефект.
Пол Натан

4

Технічно це не унікальна властивість функціонального програмування, і F # не є чистою функціональною мовою. F #, як один із нащадків ML, забезпечує чудове узгодження шаблонів та алгебраїчні типи даних. Отже, для будь-якого завдання, яке вимагає складних структур даних, F # набагато виразніше і простіше у використанні, ніж C #.

Уявіть, що реалізувати компілятор у C # та F # - представляє абстрактне синтаксичне дерево та перетворювати його набагато простіше, якщо ваша мова надає ADT та узгодження шаблонів.


2

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


2

Якщо ви хочете повністю спробувати функціональність Haskell, у Erlang також є дуже цікаві речі.

Саймон Пейтон-Джонс сказав про Haskell, він хоче мати програму, яка, очевидно, не має помилок, а не має очевидних помилок.

(Мабуть, я трохи відкинув цитату, але ви розумієте)

Обмежуючи побічні ефекти, ви набагато простіше довести свій код правильним.


1

Однією з певних переваг є те, що він набагато легше паралелізується.


2
Ви говорите про чистоту, і один очевидний недолік - це те, що чистота робить програми набагато повільнішими. Тож паралельно + чисте - це не обов'язково добре.
Джон Харроп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.