Подтвердить что ты не робот

Принципы, рекомендации и шаблоны проектирования для функционального программирования

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

4b9b3361

Ответ 1

Есть складки, разворачивается, карты и т.д.

Я считаю, что они используют лучшую практику, так как довольно легко рассуждать о своем поведении, и они часто связывают цель функции (например, просто взгляните на знаменитый Эволюция программиста Haskell и сравните новичков со старшим и с профессором).

Ответ 2

Шаблон проектирования: позволяют типы управления вашим кодированием.

  • Выясните, какой тип вы пытаетесь вернуть.

  • Знайте, что определенные конструкторы типов имеют определенный синтаксис и используют его для уменьшения желаемого типа. Вот два примера:

    • Если вы пытаетесь вернуть тип функции T1 -> T2, всегда безопасно писать

      \ x -> ...
      

      Теперь в теле вы пытаетесь создать значение типа T2, которое является меньшим типом, плюс вы получили дополнительное значение x типа T1, что упростит вашу работу.

      Если лямбда оказывается ненужной, вы всегда можете уменьшить ее позже.

    • Если вы пытаетесь создать пару типов (T1, T2), вы всегда можете попытаться создать значение x типа T1 и значение y типа T2, затем форму пара (x, y). Опять же, вы уменьшили проблему до одного с меньшими типами.

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

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

Ответ 3

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

  • Никогда не сопоставляйте шаблон подстановки _ на верхнем уровне.

  • Задайте параметры компилятора, чтобы отсутствующий случай в совпадении с шаблоном был ошибкой, а не предупреждением.

Ответ 4

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

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

Ответ 5

Шаблон проектирования: дайте компилятору вывести типы для ваших функций и убедитесь, что эти типы точно такие же общие, как вы ожидаете. Если типы более полиморфны или менее полиморфны, выясните, почему.

Например, если вы пишете функцию сортировки в Haskell, ожидайте

Ord a => [a] -> [a]

Если ваш тип

Num a => [a] -> [a]

или

[a] -> b

то что-то ужасно неправильно.

Лучшая практика: как только вы подтвердите с помощью компилятора, что тип такой, как вы ожидаете, поставьте явную подпись типа для каждой функции верхнего уровня. (Или, если вы используете ML или Caml, напишите явный интерфейс.) Задайте параметры компилятора, чтобы значения с отсутствующими сигналами вызывали ошибку.

Ответ 6

Я бы ответил с немного расплывчатым принципом: стремиться сделать ваш код красивым как наиболее важный аспект. quote Дэвид Гелнертер:

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

и Брайан Керниган:

Управление сложностью - это суть компьютерного программирования.

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

(Все это не относится только к функциональным языкам, но писать красивый код в них намного проще).

Ответ 7

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

В контексте Haskell я думал, что книга Real World Haskell содержит несколько полезных и практических советов о идиомах, абстракциях и типах классов и как. Typeclassopedia также всегда полезен. Ядро, очень абстрактные классы типов можно рассматривать как шаблоны проектирования, за исключением того, что они применяются системой компилятора/типа и частью языка (если вы узнаете, как их использовать).

В контексте Lisp Пол Грэм написал книгу под названием "Lisp (, доступную в Интернете), где он показывает, что функциональные языки идеально подходят для создания пользовательского языка программирования, а затем записывают в него свою программу. Поэтому встроенные языки, специфичные для домена, являются своего рода шаблоном проектирования.