Previous Entry Share Next Entry
photo25

как научиться ФП (repost)

Оригинал взят у bvlb в как научиться ФП
Очень просто: запрещаешь себе менять переменные. Сам с собой договорился: менять переменные больше не буду. Никогда. На характер. Функции в результате становятся чистыми, циклов больше нет, приходится юзать мапы, фолды и прочие рекурсии. Объекты перестают быть гм.. аккумуляторами и аренами и начинают под действиями функций переходить в другие объекты, подозрительно напоминая всякие там алгебраические структуры над разными множествами. Дальше архитектура становится пиздецом и приходится лезть в гугл, смотреть разные либы и придумывать как композировать функции и вылезать из пиздеца. Мозг кипит, но переменных становится все меньше и баги как-то становятся пореже.

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


  • 1
(Deleted comment)
ex_juan_gan July 17th, 2015
Это справедливо (тем более, что не в каждом топосе точка - генератор); но как это сделать на практике? Хотелось бы посмотреть на примеры кода (не на Хаскеле).

the_aaa13 July 17th, 2015
Забавно. А как не меняя переменных сделать что-нибудь тривиальное, массив отсортировать например?

lomeo July 17th, 2015
"Дальше архитектура становится пиздецом и приходится лезть в гугл, смотреть разные либы и придумывать как композировать функции и вылезать из пиздеца"

(Deleted comment)
mudasobwa July 17th, 2015
Золотые слова.

pappadeux July 21st, 2015
а потом приходят настоящие программисты и пишут StringBuilder

sebbenth July 17th, 2015
Это инструкция по написанию write-once кода, что ли?

Как это счастье модифицировать и расширять?

ex_juan_gan July 17th, 2015
При грамотном наименовании значений - элементарно.

_winnie July 17th, 2015
1) Учебники по Java, и книжка "Рефакторинг" всячески стараются учить "иммутабельность это хорошо". И я с ними согласен, до определённосй степени, см. следующий пункт.


2) Когда массив превращают в иммутабельное дерево с log(N) аллокаций памяти для нод, там где при использовании массива достаточно написать ++a[i] - то это победа иммутабельности над здравым смыслом, и вредит окружающим.

Edited at 2015-07-17 06:27 pm (UTC)

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

swizard July 17th, 2015
У меня в жизни был период, когда я считал, что переменные нужно изменять обязательно (перфоманс, ассемблер, in-place, кэширование всего, векторизация, кеш-линии и тд), и был период, когда я тоже упарывался по иммутабельности (рефакторинг, многопоточность, функциональщина и тд).

Но с годами становится понятно, что истина, как обычно, где-то посередине :)

rdia July 18th, 2015
> Но с годами становится понятно, что истина, как обычно, где-то посередине :)

Т.е., естественным образом, после освоения 2-х базовых навыков "копать" и "не копать", осваивается третий навык, зависимый от них - "копать только когда надо". :-)

vit_r July 17th, 2015
Уже само описание напоминает расползание червяков из открытой банки.

rdia July 18th, 2015
Блин, ну человек явно пишет, что учится. Человек с В/О, как правило, подсознательно учиться умеет. А когда отрабатывается навык, нужно это делать интенсивно, и не отвлекаясь на другие цели. Вот он, собственно, и отрабатывает навык написания программ в immutable стиле.

kodt_rsdn July 18th, 2015
На питоне писать функционально - одно удовольствие.
Лямбды есть (хоть и с сильно урезанным синтаксисом; но ведь есть и локальные функции).
Генераторы есть, как в нотации Цермело, так и в виде сопрограмм и продолжений.
А где генераторы - там и монады, и do-нотация (только в питоне она for, разумеется).
Типы удобные и библиотека большая.
Ленивость присобачить - немножко потрахаться один раз. Либо чуть больше писанины, на генераторах, либо чуть больше возни, на декораторах. Да и вообще, порыться в библиотеке.

bacr July 18th, 2015
LabView же. Переменные не нужны вообще. Только константы и вход выход функции. Компилятор офигенный, все параллелится на автомате и работает со скоростью как С++ (если плюсы с геморроем оптимизировали и параллелили). Создан лет 30 назад.

grey_kristy July 18th, 2015
Все это правильно и хорошо, но если язык не умеет TCO, то без циклов крайне проблематично обойтись. Аналогично с иммутабельностью - если нет встроенной поддержки можно попасть на дикий оверхед по памяти

  • 1
?

Log in

No account? Create an account