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

Я не знаю это первое, что пришло на ум, но смотрю в файле, который показывает имя пользователя, и т.д. в заголовке страницы после того, как пользователь вошел в систему. Могло бы помочь, включили ли Вы шаблонные подсказки (см. это учебное руководство .

, Когда Вы находите строку таким как "Hello ", просто копируете ту строку и показываете его, где Вам нужно к

5
задан Łukasz Lew 29 April 2012 в 20:43
поделиться

7 ответов

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

8
ответ дан 18 December 2019 в 06:03
поделиться

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

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

6
ответ дан 18 December 2019 в 06:03
поделиться

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6
ответ дан 18 December 2019 в 06:03
поделиться

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

2
ответ дан 18 December 2019 в 06:03
поделиться

рекурсия. Временами сложно осмыслить это

1
ответ дан 18 December 2019 в 06:03
поделиться

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

1
ответ дан 18 December 2019 в 06:03
поделиться

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

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

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

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

Некоторые для начала:

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

Развлечения с фантомными типами

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

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

Некоторые для начала:

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

Развлечения с фантомными типами

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

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

Некоторые для начала:

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

Развлечения с фантомными типами

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

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

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

3
ответ дан 18 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: