Какую технику в функциональном программировании сложно освоить, но потом полезно? - PullRequest
5 голосов
/ 17 сентября 2009

Этот вопрос, конечно, вдохновлен Монадой в Хаскеле.

Ответы [ 7 ]

8 голосов
/ 17 сентября 2009

обернул голову вокруг стиля продолжения продолжения очень помог моему кодированию javascript

6 голосов
/ 17 сентября 2009

Вы хотите измерить полезность в связи с самим функциональным программированием или программированием в целом?

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

  • Хранение неизменных данных
  • Декларативная формулировка (рекурсия, сопоставление с образцом)
  • Обработка функций как данных

Так что я бы сказал, что функциональное программирование - это ответ на ваш вопрос.

Но чтобы дать более конкретный ответ, я бы проголосовал за функциональные механизмы абстракции, такие как

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

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

Сравните следующее (псевдокод):

// Concrete
def sumList(Data : List[Int]) = ...

// Generic
def sumGeneric[C : Collection[T], T : Num](Data : C) = ...

Последнее может быть несколько неинтуитивным по сравнению с первым определением, но оно позволяет вам работать с любым типом коллекции и числового типа в целом!

В целом, многие современные (основные) языки открыли такие преимущества и представили очень функциональные функции, такие как лямбда-функции или Linq . Понимание этих методов также улучшит написание кода на этих языках.

6 голосов
/ 17 сентября 2009

Я бы сказал Первоклассные функции.

В информатике, программирование говорят, что язык поддерживает первоклассные функции (или функции литералы), если он рассматривает функции как первоклассные объекты. В частности, это означает, что язык поддерживает построение новых функций во время выполнение программы, хранение их в структурах данных, передавая их как аргументы для других функций, и возвращая их как значения других функции. Эта концепция не распространяется любые средства, внешние по отношению к языку и программа (метапрограммирование), такая как вызов компилятора или eval функция для создания новой функции.

3 голосов
/ 18 сентября 2009

Один из «продвинутого» отдела: программирование с фантомными типами (иногда также называемыми индексированными типами). По общему признанию, это не «стандартная» техника в функциональном программировании, но и не совсем эзотерическая, и это то, что заставляет ваш мозг работать некоторое время (вы просили что-то сложное, верно?;)).

В двух словах, речь идет о параметризации типов для кодирования и статического применения определенных свойств во время компиляции. Одним из стандартных примеров является функция сложения векторов, которая статически гарантирует, что заданные два вектора длины N и M вернут вектор длины N + M, иначе вы получите ошибку времени компиляции. Да, есть более интересные приложения.

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

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

Некоторые закуски:

Общий и индексированный тип (слайды с кратким обзором приложений)

Приколы с фантомными типами

Документ Кеннеди и Руссо, упомянутый на слайдах: Обобщенные алгебраические типы данных и объектно-ориентированное программирование и помещает некоторые из этих вещей в контекст C # / Java.

Глава 3 в книге Дэйва Абрахама Метапрограммирование шаблона C ++ - , доступное онлайн как пример главы , и использует эти методы в C ++ для анализа измерений.

Практическим проектом FP ​​с использованием фантомных типов является HaskellDB.

2 голосов
/ 17 сентября 2009

Я бы сказал, что Структурная типизация в OCaml особенно полезна.

1 голос
/ 17 сентября 2009

Концепция функций высшего порядка, лямбда-функций и возможностей универсальных алгоритмов, которые легко комбинировать, были для меня очень полезны. Я всегда взволнован, когда вижу, что я могу сделать с фолдом в хаскеле. Кроме того, мое программирование на C # сильно изменилось (надеюсь, к лучшему) с тех пор, как я начал заниматься функциональным программированием (особенно на haskell).

1 голос
/ 17 сентября 2009

рекурсия. Трудно иногда обернуть вокруг него голову

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