У кого-нибудь есть хорошая ментальная модель или метафора для функционального программирования, которая ссылается на что-то в реальном мире?
Объектно-ориентированное программирование интуитивно понятно для меня. Есть вещи, которые имеют свойства, и иногда они также могут делать вещи или выполнять вычисления своих свойств (методов). (Пример: автомобиль, форма, кот).
Я не занимаюсь функциональным программированием, и я не заинтересован в спорах о достоинствах этих двух. Мне просто нужна метафора или ментальная модель для работы с объектно-ориентированным программированием.
Какие хорошие ментальные модели или метафоры реального мира для программирования в функциональной парадигме? В функциях, состоящих из функций обработки функций, есть что-то, что не дает возможности стоять и размышлять.
источник
Ответы:
Функциональное программирование - это объединение небольших функций для достижения ваших результатов. Приличная ментальная модель (по крайней мере для меня) - это сборочная линия. Каждая составная функция - это еще один шаг в процессе сборки. Рассмотрим эту функцию здесь:
В Haskell эта функция будет возвращать наименьший элемент в списке. Сборочная линия сначала сортирует входные данные, затем возвращает первый элемент (при условии, что он отсортирован от наименьшего к наибольшему). Если мы хотим получить только наименьшее четное значение, то мы можем изменить сборочную линию так, чтобы она выглядела следующим образом:
Это просто еще один шаг на конвейерной ленте.
В двух словах, функции просто описывают шаги, предпринятые для преобразования необработанного ввода (частей) в обработанный товар (вывод.)
источник
(f . g) (x)
означаетf(g(x))
илиf . g
означает\x -> f (g (x))
..
это так; это не то, как работает Haskell в целом . С таким же успехом вы можете определить оператор прямого канала F # (|>
) в Haskell и записать,smallest x = (sort x) |> head
и данные будут течь правильно. Просто подумал, что укажу на это.Математика. Функциональное программирование основано на математике и основано на ней. Математические функции не имеют состояния, не имеют побочных эффектов и т. Д., Как и в случае с FP. Если вы будете думать о FP с точки зрения математических функций, а не с использованием подхода «как мне поступить с этим» в стиле ОО, вы будете в хорошей форме. Однако, если вы попытаетесь привнести в ОО чувствительность ОО, вы будете плыть против течения.
источник
Как насчет флип книги ?
Во флипбуке каждая страница представляет мир таким, каким он существует в данный момент времени. В нашей программе мир представлен в виде некоторой сложной структуры данных (например, у нас есть банан, который находится в руке гориллы, которая находится в дереве, которое находится в джунглях). Каждая последующая страница продвигает историю, слегка изменяя предыдущее представление. В FP постоянные структуры данных были разработаны для эффективного повторного использования предыдущих структур, так что изменение обеспечивает только дельту, а не полностью новое представление.
Что может быть неочевидным, так это то, что страница в нашей флипбук также будет представлять нематериальные активы. Например, если горилла сбрасывает банан, мы можем начать применять эффекты гравитации к его приличному ускорению и движению к полу джунглей. Чтобы приспособиться к этому, мы добавили бы такие атрибуты, как скорость и траектория к нашему банану
В нашей программе была бы функция, которая принимает в качестве аргумента страницу перевернутой книги (она же состояние мира) и выдает новую страницу . Таким образом, наша история рассказывается без реального изменения состояния существующих объектов. Мы просто заменяем каждую страницу более новой, используя то, что фактически является расчетом.
источник
Отношения.
Друг: Учитывая двух человек, дружеские отношения следуют этим общим законам
Моноид: учитывая несколько элементов и функцию, которая принимает 2 элемента и возвращает 1, моноидальное отношение следует этим общим законам
Функциональное программирование - это все обобщения, друг - это очень общие отношения, которые можно увидеть в многочисленных сценариях, но во всех различных форматах, как правило, они следуют приведенным выше законам.
Признавая законы, которые регулируют отношения между вещами, вы можете создавать общие реализации, которые работают с любым форматом вещей, которые имеют такие отношения. В функциональном программировании вы пытаетесь определить отношения между вещами, чтобы их можно было классифицировать и рассматривать в целом.
Вы хотите метафору из реального мира? Посмотрите, как все взаимосвязано, и попытайтесь определить общие законы (как это применимо к нескольким сценариям, где вещи, отличные от законов, могут отличаться). Существует связь между служащим регистратуры и покупателем в магазине, у него есть некоторые общие законы, программное обеспечение было разработано для облегчения целей людей в этих общих отношениях на пути систем POS. Точно так же, когда вы начинаете видеть эти общие законы, определяющие, как все связано, вы можете начать полагаться на законы этих отношений при написании своего программного обеспечения, а не на конкретные особенности экземпляра отношений.
источник
Все является значением, и вы применяете функции к значениям (которые могут быть функциями) для создания новых значений, предпочтительно без каких-либо побочных эффектов.
источник
Главное, что нужно понять о функциональном программировании, это то, что все является ценностью, даже сам код является «ценностями».
Лучший пример простой функциональной среды программирования - это любимый всеми бизнес-инструмент - электронная таблица. Каждая ячейка в электронной таблице - это либо данные, либо результат функции. Более того, эта функция не может отключиться и изменить другую ячейку.
Когда один перемещается на функциональных языки, а не декартова сетка из
A1
иB42
функции имеют имена. Это все, что есть на самом деле.Есть и другие аспекты, которые можно добавить помимо этого ... но это функциональное программирование по своей сути. Не нужно беспокоиться о структуре списков или группировке вещей. Функциональное программирование - это передача значения в функцию и возвращение значения без каких-либо изменений в памяти.
Это оно. Функциональное программирование - это электронная таблица с именами, а не сеткой.
источник
Вы можете думать о функциональном программировании как о поведении . Программа - это описание поведения компьютера. Функции - это базовая единица поведения, а состав функций - это один из способов построения больших поведений из меньших.
В ООП объект кода предназначен для того, чтобы быть состоянием объекта в проблемной области; он изменяется со временем, чтобы отразить изменения в этом доменном объекте. В FP значение представляет состояние объекта домена; оно никогда не меняется, вы просто создаете разные значения для представления разных состояний.
Я нахожу функциональную модель более честной в том, что на самом деле делают компьютеры - представляют. В конце концов, я не могу просто вызвать
new Tesla()
из воздуха. :)источник
Предложения более функциональны, чем объектно-ориентированные, при условии, что вы разбили их более или менее следующим образом ...
Таким образом, нам нужно найти ключевые фразы, а затем остальные:
За один присест:
Разобрать дерево:
Скупость поражает функциональное мышление;
Снимаю шляпу перед Готлибом Фреге, 1890-е годы, Аланом Тьюрингом (entschiedungsprobleme), 1930-е годы, Ноамом Хомским (1960-е годы).
источник