← All posts tagged Haskell

Таки вынесу из комментов:
juick.com

Я достаточно толерантен к средствам разработки. Даже на Java могу писать, вобщем-то, не плюясь. Разумеется, Лисп в фаворитах.

Но от хаскеля у меня сплошной фейспалм, и не просто так, потому что якобы "нравится-не-нравится", я ведь не обезъяна, а потому что как в языке, так и в библиотеках, так и в коммпьюнити в целом — один сплошной фейспалм. Хаскель — неюзабельное распиаренное дерьмо. Причем что отвратительно, распиаренное тем что он якобы "для умных". На деле он просто для задротов, которые не знают на что бы просрать свою жизнь. Как C++, только хуже. Опять же, существование C++ оправдывается кучей легаси. Существование и популярность хаскеля оправдывается исключительно задротством.

На самом деле, вся суть хаскеля, как написал @netneladno в том треде — "мы[авторы haskell] были угорелыми хиппи и решили угореть по ленивости, просто по приколу"

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

juick.com

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

1. Статическая типизация это говно ссаное нахуй не нужное, потому что на практике решает система ограничений на значения, причем опционально подключаемая(потому что для тьюринг-полного языка натянуть ее повсюду невозможно). Не так давно хаскелоиды и сочувствующие это стали называть "зависимые типы" и выдавать за охуенное изобретение, хотя на самом деле это, во-первых, называется constraint propagation, во-вторых к типизациям отношение имеет крайне отдаленное, и в-третьих, это было в компиляторах лиспа уже лет 20 назад(в том же CMUCL).

2. Монада(как и много других вещей в хаскеле и пр.) это такой классический пример изъебства на пустом месте. Вот знаете, типа как в С++ можно на шаблонах нахреначить факториал(и даже больше — один всем известный наркоман даже интерпретатор схемы написал) в компайл-тайме. Ну можно, да, ну охуеть, только вот встают вопросы — ну типа, во-первых, нахуя это вообще надо, считать факториалы в компайл-тайме, а во-вторых, нахуя их считать с таким страшным изъебством если на C++ без шаблонов и то получается проще на порядки. Это дает охуенный простор для задротства, конечно, но блять, а как насчет решения задач?

Кстати, насчет задроства — уже упомянутый C++ дает просто огромнейший простор для задрачивания бессмысленной хуеты на пустом месте. Раньше это был эталонный язык для подобного рода занятий(кстати, именно этим и объясняется любовь к нему определенного круга лиц). Сейчас, как я понимаю, C++ в этих делах отходит на второе место, в пользу хаскеля.

3. Блять, парсер-комбинаторы это же игрушка, ну правда. Парсить что-либо в продакшне парсер-комбинаторами, а не нормальными парсерами(от LL(1) и packrat+PEG до GLR), это знаете, типа как узнавать размер файла считав его весь в массив и вызвав функцию length. То есть, ну ок, может и нормально, если ты питонщик, и вообще, получаешь инвалидное пособие за умственную отсталость, но блять, в приличном обществе за такое надо руки отрубать.


А и кстати — DSL в рантайме, на фвп и прочей хуете это пиздец говно и кривота. DSL надо писать или на лиспе или, если лиспа у вас по странным причинам нету, конпилировать заранее с помощью чего-то типа ANTLR.

linux.org.ru

Хотя я часто не согласен с @archimag в вопросах лиспа, но тут таки да, соглашусь.

Вообщем, чтобы REPL был столь же полезен, как и в лиспе, нужно чтобы у языка программирования была модель исполнения как у лиспа, или как у смоллтолка, например — то есть, "живая" среда программирования, которую изменяешь под себя.

В Python и многих других "скриптовых" языках модель исполнения совершенно не такая(что в случае Python отлично видно на примере системы модулей, как @archimag правильно сказал).

В случае haskell и других статических языков — тем более, полноценный REPL невозможен, т.к. там модель языка абсолютно противоположна лисповой.

А расскажите-ка про forkIO.

Мне на днях пришла в голову шизофреническая идея о языке программирования, где все функции выполняются как бы параллельно, в тред-пулах, например, а контроль за синхронизацией идет через реакции(см. github.com При этом никаких тредов/мьютексов/etc снаружи не видно. Ну, типа — язык программирования в котором функции примерно эквивалентны процессам UNIX-подобных ОС, при общей императивности/процедурности/умеренной_функциональности(как в лиспе) языка.

Так вот, forkIO это есть нечто похожее, не? Название заинтересовало.

цитата из
ivan-gandhi.livejournal.com

--------------
Ну вот я пытаюсь многократно добиться каких-то обьяснений, в чём же разница — и в результате мне отвечают что-то типа "можно и на ассемблере писать" и обижаются. Ну да, можно, но разница между ассемблером и не-ассемблером мне понятна, а разница между if() и монадой трансформацией — на практике то есть — не совсем.
Т.е. для лингвиста очень полезно знать, почему мы говорим именно такой прозой, это я понимаю, но для того, чтобы говорить, это совершенно не необходимо (и не достаточно, кстати). Вот мне и хочется понять — оно к чему-то ещё дополнительному полезно или находится в таком же отношении ко мне, как знание, к какому склонению относится слово — к умению говорить по-русски. Это я не в порядке критики, а в порядке честного любопытства спрашиваю, я не подвергаю сомнению тот факт, что вам и лингвистам эти вещи очень интересны и полезны.
-------------

Неплохой срач: linux.org.ru

Оттуда(а че, доля правды есть, и немаленькая):
------------------
[про реализацию стека(всмысле объект который может push, pop и пр) на замыканиях из SICP]
Именно для этого там методы выведены в (define ...) — чтобы можно было всегда себе напомнить. Есть вариант и более короткий (см. выше). Как я понимаю, у хаскидебилов понятность кода определяется исключительно по его длине и обфускации всякими <$> ~= и прочим говном. Следуя такой логике, нет ничего понятнее однострочников перла.

users.livejournal.com

О! Совершенно охренительный срач про хаскель.

Кстати, разница между программистом на Си(да или на любом из многих других мейнстримных, и не очень, языков), и хаскелем — когда на Си пишут в стиле "three star programmer", за это ругают. Когда на хаскеле — это считается круто, и вообще Ъ.

Разница между статической и динамической типизацией на самом деле не в том, когда происходят проверки типов - при компиляции, или в рантайме.

Это разница в подходе, в отношении к программам.

Существует известная цитата Робина Милнера:
-------------------------------------
 Well-typed programs never go wrong.
-------------------------------------
В этом вся статика, в этом весь хаскель и подобные языки. И в этом причина их переусложненности, и всех неудобств при их использовании для написания real-world программ.

В противопоставление, приведу цитату из стандарта Common Lisp:
http://www.lispworks.com/documentation/HyperSpec/Body/f_error.htm
-------------------------------------
 (defun wargames:no-win-scenario ()
   (if (error "pushing the button would be stupid."))
   (push-the-button))

In this scenario, there should be no chance that error will return and the button will get pushed.
While the meaning of this program is clear and it might be proven `safe' by a formal theorem prover, such a proof is no guarantee that the program is safe to execute. Compilers have been known to have bugs, computers to have signal glitches, and human beings to manually intervene in ways that are not always possible to predict. Those kinds of errors, while beyond the scope of the condition system to formally model, are not beyond the scope of things that should seriously be considered when writing code that could have the kinds of sweeping effects hinted at by this example.
-------------------------------------

Проблема в том, что хаскель и подобные языки целиком и полностью полагаются на абстракции. И строят из них другие абстракции, которые полностью закрывают предыдущие, и так далее. А это неправильное использование абстракций, особенно в контексте Software Engineering.

Потому что абстракции всегда текут.
http://www.joelonsoftware.com/articles/LeakyAbstractions.html

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

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

А есть какой-нибудь язык, который собой представляет что-то среднее между Си и хаскелем/ML? Т.е. низкоуровневый, автоматическое управление только памятью на стеке, указатели(но типизированные). И в то же время статика направо и налево, адско злая типизация, ADT, паттерн-матчинг и пр.