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

Представь, что у тебя есть три волшебные машины: машина A, машина B и машина C. Каждая машина делает что-то особенное с предметами:

1. Машина A окрашивает вещи в зеленый цвет.

2. Машина B делает вещи в два раза больше.

3. Машина C превращает фрукты в овощи.

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

haskell

type Item = String

machineA :: Item -> Item

machineA item = "зеленый " ++ item

machineB :: Item -> Item

machineB item = "большой " ++ item

machineC :: Item -> Item

machineC "яблоко" = "маленькая красная морковка"

machineC item = item

transformItem :: (Item -> Item) -> (Item -> Item) -> (Item -> Item) -> Item -> Item

transformItem = (.) . (.)

В этом примере мы определяем тип Item для представления предметов. Мы также определяем функции machineA, machineB и machineC, которые соответствуют машинам A, B и C из нашего описания. Затем мы определяем функцию transformItem, которая позволяет нам применить три машины одна за другой к предмету.

haskell

main :: IO ()

main = do

let item = "яблоко"

let transformedItem = transformItem machineA machineB machineC item

putStrLn transformedItem

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

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

Больше примеров в https://t.me/Koding404

1
Автор поста оценил этот комментарий

Ничего непонятно. Не знаком с этим языком, но знаком с логикой.


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


Если же они выполняются рекурсивно, т.е. в обратном порядке, то об этом неплохо было бы сказать. И в таком случае получится "зеленый большой маленькая красная морковка".


Совсем хорошо было бы прикладывать вывод результата из консоли. Это значит, что Ваш код работает и Вы его проверяли.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

По результату вы правы, будем прикладывать консоль и перепроверять примеры. Спасибо за коммент.

Иллюстрация к комментарию
1
Автор поста оценил этот комментарий

На Хабре ваши писульки никому не нужны так вы сюда пришли? И тут они тоже не нужны.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

На Хабре, а где они там?

показать ответы
0
Автор поста оценил этот комментарий

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


1. Первый момент касается функции `transformItem`. В этом случае она действительно может выглядеть усложнённой, особенно для тех, кто только начинает изучать Haskell. Эта функция использует композицию функций `(.)`, которая является важной концепцией в функциональном программировании и позволяет применять несколько функций последовательно.


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


3. Что касается "конструкции с сиськами", здесь имеется в виду оператор композиции функций `(.)`. Этот оператор принимает две функции и возвращает новую функцию, которая применяет эти две функции последовательно. Здесь он используется дважды для создания функции, которая применяет три функции последовательно.


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


Я надеюсь, это объяснение помогло разъяснить некоторые вопросы.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Для упрощения заменим функцию `transformItem` на простую последовательность вызовов функций `machineA`, `machineB` и `machineC`.


Здесь мы явно вызываем `machineA`, `machineB` и `machineC` в определенном порядке. Это более прямой и понятный подход, но он менее гибкий, чем использование функции `transformItem`, которая может принимать разные функции и применять их в любом порядке.В этом примере мы видим, что функции в Haskell действительно являются "first-class citizens": мы можем передавать их как аргументы другим функциям, возвращать их как результаты и использовать их так же, как и любые другие значения.

Иллюстрация к комментарию
показать ответы
5
Автор поста оценил этот комментарий

На кой чёрт это усложнение с transformItem?

Если бы я не знал хаскель вообще ни черта не понял-бы.

Если уже говорить что это пример про что что функции тут first class sitizen то можно было-бы обойтись передачей списка ф-ций и рекурсивный проход по нему, без раздувания сигнатуры.

Ну и просто хотя бы пояснение что за "конструкция с сиськами" было-бы хорошо написать.

Ваш пример скорее пугает новичка чем показывает красоту языка.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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


1. Первый момент касается функции `transformItem`. В этом случае она действительно может выглядеть усложнённой, особенно для тех, кто только начинает изучать Haskell. Эта функция использует композицию функций `(.)`, которая является важной концепцией в функциональном программировании и позволяет применять несколько функций последовательно.


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


3. Что касается "конструкции с сиськами", здесь имеется в виду оператор композиции функций `(.)`. Этот оператор принимает две функции и возвращает новую функцию, которая применяет эти две функции последовательно. Здесь он используется дважды для создания функции, которая применяет три функции последовательно.


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


Я надеюсь, это объяснение помогло разъяснить некоторые вопросы.

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества