Так написал(а):Хотел обратиться лично, но, думаю, пока у нас тут затишье на форуме - можно пообщаться и публично.
Итак, троль, несколько (для начала) вопросов по Хаскель (насколько я понимаю, вы работаете с ним довольно активно).
Что в нем хорошо, что плохо по вашему мнению?
Какие приложения вы реализовывали?
Использовали ли когда-нибудь happstack?
Я активно пишу на агде (Agda), а на хаскеле я кажется ни разу не написал программу, которая была бы больше 200 строк. Так что ни в экосистеме, ни в методах дебага/профилирования я не разбираюсь, хотя сам язык знаю относительно неплохо, как и многие идиомы, поскольку сижу на stackoverflow и читаю релевантные статьи.
Так написал(а):Что в нем хорошо, что плохо по вашему мнению?
Что хорошо, то и плохо. Чистота (purity) гарантирует (если не пользоваться грязными трюками), что чистая функция, вызванная с одними и теми же аргументами, всегда вернет один и тот же результат (то есть нет глобальных переменных — только глобальные константы, нельзя читать из stdin и т.д.), но если тебе вдруг понадобится в этой функции вывести что-нибудь на экран, то ее всю придется переписывать (для отладочной печати есть модуль Debug.Trace, который позволяет не переписывать функцию, но в нем используются "грязные трюки").
Абсолютно уродская система эффектов (monad transformers), которая превращает написание любой более-менее реальной программы в эквилибристику с типами.
Ленивость (laziness) позволяет писать хорошо структурированные программы (а также делать то, что в обычном языке типа Java сделать вообще нельзя, как например функция в хаскеле может в своем теле использовать то значение, которое она только в будущем вернет; более того, ленивость иногда позволяет улучшить алгоритм асимптотически (есть статья про то, как один алгоритм из O(2^n) превращается в O(n) — из экспоненциального в линейный)), но также является причиной неочевидных утечек памяти. Вместо того, чтобы выполнять код, как это делается в императивных языках — строка за строкой, хаскель строит граф программы и проводит на нем редукцию, то есть о том, чтобы понимать, как именно происходит вычисление, вы можете забыть, поскольку это требует глубокого знания компилятора (причем в разных компиляторах все это реализовано по-разному).
Статья про то, как писать на хаскеле программы, которые используют все преимущества строгой типизации, так и называется — "Hasochism. The Pleasure and Pain of Dependently Typed Haskell Programming." ("hasochism" — от "haskell" и "masohism"). То есть их как бы можно писать, но никто этого не делает, потому что минусы значительно перевешивают плюсы.
Алгебраические типы данных и сопоставление с образцом очень удобны (поэтому они есть в Scala и Rust), и в императивных языках их не хватает.
Классы типов меня раздражают. В агде используется намного более адекватный механизм (который правда забагован).
Большинство из этих недостатков исправлены в Idris (система эффектов в нем на три головы лучше, чем любая из тех, что я видел, причем реализована средствами самого языка, а не в компиляторе), но он еще очень молодой, и экосистема только развивается. Как по мне, он должен заменить Haskell.
Отредактировано троль (2015-07-15 19:10:49)