Каков исчерпывающий список руководств/практик/правил, полностью соответствующих функциональной парадигме?

Я начал играть с Kotlin, но я чувствую свои собственные ограничения в том, как я программирую. Моя проблема в том, что я все еще думаю о Java, поэтому стиль по-прежнему императивен, мой вопрос ко всем фанатикам функционального программирования, который, я считаю, будет очень полезен для всех людей, которые на самом начальном этапе, а также должны «тормозить» свой мозг, чтобы начать строить его снова; выйти из зоны комфорта и начать мыслить псевдо, а не на «своем родном языке». Я считаю, что опытные разработчики-полиглоты могут разжевать концепции до простых советов о том, что делает вашу программу полностью функциональной, а что нарушает парадигму. Я не знаю всех особенностей, но, пожалуйста, не стесняйтесь включать общепринятые термины, которые могут быть мне неизвестны (я всегда могу найти). На данный момент мне нужен этот набор правил, чтобы сначала заставить себя страдать и не нарушать их, но потом я знаю, что почувствую это, проанализирую правила и пойму, чем они хуже/лучше, что, конечно, является моей домашней работой.

Таким образом, пример этих рекомендаций будет выглядеть примерно так:

  • Никогда не меняйте состояние, этого можно избежать, используя x, y, z
  • Работайте, используя только функции высшего порядка (возможно, я ошибаюсь, просто пример)

Я надеюсь, что ответ даст мне долгосрочную ссылку на то, чтобы поставить себя в экстремальные условия, когда я перестану убегать в ООП всякий раз, когда чувствую себя некомфортно. И теперь, когда я смотрю на Kotlin, я понимаю, как я должен был думать о проблемах, о намерении, а не о структуре, навязанной тем или иным языком. Намерение всегда можно преобразовать в язык по вашему выбору и подкрепить шаблонами проектирования, применимыми к языку, но чтобы найти золотую середину, мне нужно сначала выйти из зоны комфорта.


person Aubergine    schedule 06.04.2017    source источник
comment
A) Никогда не изменяйте какие-либо переменные, а только создавайте новые переменные B) Выделите повторяющийся код во вспомогательных функциях (возможно, более высокого порядка) C) Найдите имена и структуру этих вспомогательных функций в стандартной библиотеке и научитесь использовать их вместо своих собственных   -  person Bergi    schedule 06.04.2017
comment
Точного определения ФП нет, но я хочу оставить совет: попробуйте решить известную задачу и наложите на себя ограничения. Никогда не менять состояние — хорошее начало. Другие идеи: без петель; избегайте утверждений и предпочитайте выражения; строгое разделение данных и логики; обрабатывать ошибки без использования исключений; построить программу, просто составив функции; постарайтесь иметь только одно место, которое выполняет ввод-вывод, а остальное держите в чистоте.   -  person stholzm    schedule 06.04.2017


Ответы (1)


  • Избегайте изменяемых состояний как чумы.

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

  • Избегайте побочных эффектов, как чумы.

    Уродливый родственник изменчивого состояния, побочные эффекты. Побочные эффекты означают что угодно, кроме получения значения и возврата значения в функцию. Если эта функция печатает данные, изменяет глобальные переменные, отправляет сообщения в потоки или что-то еще, кроме простого получения ее параметров, вычисления из них значения и возврата значения, эта функция имеет побочные эффекты. Побочные эффекты важны (см. следующий пункт), но если вы их часто используете, их невозможно отследить. Просто подумайте о том, как все говорят вам избегать глобальных переменных в императивном программировании. Функциональное программирование идет еще дальше и пытается избежать всех побочных эффектов. Основная часть вашей программы должна состоять из чистых функций. (Смотрите дальше)

  • Если вам нужно использовать побочные эффекты, держите их под контролем.

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

  • Используйте чистые функции для всего, что только возможно.

    Это своего рода обратная сторона предыдущего пункта. Чистая функция — это функция, которая не имеет побочных эффектов и ничего не изменяет. Он может только принимать параметры и возвращать значение. Вы должны использовать их много. Например, вместо того, чтобы вести журнал в функциях, которые выполняют вычисления, вы должны создавать свои строки журнала с использованием чистых функций, а затем позволять слою побочных эффектов вызывать эти чистые функции, вызывать более чистые функции для форматирования строк журнала. в полный журнал, а затем вывести сам журнал из слоя побочных эффектов.

  • Используйте функции высшего порядка для структурирования кода.

    Функции высшего порядка в некотором роде являются тем связующим звеном, благодаря которому функциональное программирование работает. Функция высшего порядка — это функция, которая принимает одну или несколько функций в качестве параметров и/или возвращает функцию. Сила функций высшего порядка заключается в том, что они могут инкапсулировать многие шаблоны, которые вы использовали бы в программе императивного стиля в декларативной манере. Например, давайте взглянем на три наиболее распространенные функции высшего порядка:

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

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

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

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

Это определенно не исчерпывающий список приемов функционального программирования, но я думаю, что большинство функциональных программистов согласятся, что эти пять рекомендаций составляют основу функционального программирования. Если вы действительно хотите научиться их применять, я бы посоветовал изучить чистый язык функционального программирования, такой как Haskell, поэтому вам придется отказаться от императивной парадигмы и научиться функционально структурировать вещи. вместо. Я бы порекомендовал фантастический Программирование на Haskell с первых принципов в качестве начального ресурса, если вы решите пойти по этому пути. Если вы не хотите или не можете внести наличные, Brent Yorgey's Haskell курс в UPenn также является отличным бесплатным ресурсом.

person Pedro Castilho    schedule 06.04.2017