metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2015-08-12 10:56 am

Запретить жабу, дотнет, пхп, перл и крестики, только ФП, только хардкор

https://medium.com/@yelbota/%D0%BA%D1%80%D1%83%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82-%D1%83%D0%BD%D1%8B%D0%BB%D1%8B%D1%85-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%BE%D0%B2-612c72738d04

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

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

[identity profile] jdudzik.livejournal.com 2015-08-14 07:00 am (UTC)(link)
> Единственный осмысленный случай применения наследования - перекрытие реализации по умолчанию

Неверно. Наследование нужно, чтобы тысячу раз не писать один и тот же код.

Реализовывать можно по разному. Можно жёсткое, как в C++/Java. Можно duck typing, как в Go. Можно как в Python. Можно через прототип как в JavaScript. Но везде одно и то же преимущество: можно унаследовать, использовать родительский код и не задумываясь создать в любом месте программы.

В Haskell этого нет и не будет. В каждом случае надо отдельно ломать голову - как бы это написать, чтобы уважаемый язык соизволил понять, какой тип в данном случае нужен.

[identity profile] permea-kra.livejournal.com 2015-08-14 07:17 am (UTC)(link)
>Наследование нужно, чтобы тысячу раз не писать один и тот же код.

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

Даже в С++ для написания реюзабельного кода гораздо удобней использовать генерики на шаблонах, чем наследование.

> В каждом случае надо отдельно ломать голову - как бы это написать, чтобы уважаемый язык соизволил понять, какой тип в данном случае нужен.

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

[identity profile] jdudzik.livejournal.com 2015-08-14 07:23 am (UTC)(link)
> Даже в С++ для написания реюзабельного кода гораздо удобней использовать генерики на шаблонах, чем наследование.

А вот и не всегда

> Это просто ложь. Нужно ломать голову, чтобы сказать что-то осмысленное - ну так это везде так. Скажите спасибо компилятору, что он (в отличии от руби, например) может отловить, когда вы говорите явную глупость.

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

[identity profile] thedeemon.livejournal.com 2015-08-14 07:55 am (UTC)(link)
>Нужно, что машина подчинялась, а я - приказывал.

Если машина при этом не будет делать должных проверок, получится как обычно в JS, питоне и подобных: миллионы человекочасов втыкания в Undefined is not a function.

[identity profile] thedeemon.livejournal.com 2015-08-14 07:56 am (UTC)(link)
>Наследование нужно, чтобы тысячу раз не писать один и тот же код.

Параметрический полиморфизм и тайпклассы (в которых таки есть наследование) в хаскеле вроде неплохо с этим справляются. В отличие от того же Go, про хаскель я как-то не встречал жалоб "о, надо один и тот же код писать много раз".

[identity profile] jdudzik.livejournal.com 2015-08-14 09:38 am (UTC)(link)
На Хаскелле вообще мало что можно встретить. Потому что на Go уже сейчас пишут много, а на Хаскелле - писали и пишут (а ещё платят) очень-очень мало

[identity profile] metaclass.livejournal.com 2015-08-14 09:02 am (UTC)(link)
На хаскеле реализовать прототипы достаточно просто, а повторное использование там делается и без наследования, через ФВП и классы типов.

[identity profile] jdudzik.livejournal.com 2015-08-14 09:37 am (UTC)(link)
Классы типов, типы классов, классы типов классов, типы классов типов....

Ну да, программист не должен работать над предметной областью. Программист наверное должен язык задрачивать годами. Потому что главное в проекте не заказчик, а компилятор

[identity profile] thedeemon.livejournal.com 2015-08-14 10:46 am (UTC)(link)
Там нечего задрачивать, хаскель как язык проще C# (тупо по объему спецификации, количеству материала для задрачивания), а уж за С++ вообще ни одному языку не угнаться, там жизни не хватит. И ничего, народ это не особо останавливает в случае С++.

[identity profile] jdudzik.livejournal.com 2015-08-14 11:16 am (UTC)(link)
В случае С++ можно что-то написать вообще языка толком не зная. С с классами и вперёд.

В случае Хаскелла - отдельная долботня с каждой библиотекой.

Вообще, сравнивать языки - гиблое дело, их уже сравнили рынок и индустрия. C++, C#, Go, Rust, Python, Java, JavaScript - заняли свою нишу. Чистые ФП не были нужны 10 лет назад и не будут нужны сейчас.

Даже SICP уже давно на Python. Как оказалось, Scheme там был нужен не потому, что LISP круче, а потому что простой и компиляторы были чуть ли не под Spectrum
Edited 2015-08-14 11:17 (UTC)

[identity profile] thesz.livejournal.com 2015-08-17 04:48 pm (UTC)(link)
"Вообще C++ толком не зная" это, примерно, пять лет использования C++.

Да, в этом случае кое-что написать можно.