Не сразу решился написать это сообщение, т.к. подозреваю что часть народа воспримет его как повод для "войн". Но я всё же надеюсь что большая часть читателей (а особенно модераторы ) поймут что это истинные эмоции, а не "провокация войны" какая-то.
Т.к. об этом всё равно спросят, то напиши сразу: мои (и моих команд) основные инструменты в реальной работе это C++ (11-ый) и Python (2-ой). Естественно для всяких специальных целей применяются другие языки (всякие Javascript, Assembler, XSLT, Lua, SQL и т.п.). Кроме этого есть ещё набор языков, которые я (уже только лично) смотрел "для фана" (Lisp, Prolog, Smalltalk, OCaml, Erlang, D) и набор языков, которые когда-то изучал, но потом выкинул на помойку за ненадобностью (Pascal, Java, C#, PHP).
Haskell'я, как видно, тут нет — как-то так сложилось. А при этом я слышал о нём очень много всего от окружающих. Из этих слухов у меня сформировалось следующее впечатление:
— язык мегасложный, только для самых самых, но зато кто освоит, может творить невероятные вещи, недоступные в других языках
— язык находящийся на острие прогресса, так сказать идеальный функциональный язык, впитавшией в себя всё лучшее из всех остальных
— т.к. поддерживается статическая типизация, компиляция в native и были слухи о хорошем быстродействие в некоторых случаях, то я уже даже подумывал что это возможная замена наших реальных инструментов (хотя пока только D рассматривал в этом смысле).
И вот у меня нашлось свободное время, когда я решился взяться за Haskell. Прочитал несколько вводных статей, скачал среду, написал несколько программок. Одну даже с GUI (на базе знакомой C++ библиотечки, к которой у Haskell есть биндинг) ради смеха. И захотел поделиться с вами ощущениями...
Если очень кратко, то "я в шоке".
А теперь подробнее... Для начала скажу что ничего сложного в нём так и не обнаружил — довольно простой и логичный язык. И это будет единственный положительный отзыв...
Ну а далее я просто увидел набор всех тех же самых вещей из своих рабочих языков (даже не из тех модных, которые "для фана"!), только записаных более неудобным (хотя и более кратким) способом. Те же генераторы, условия, шаблоны, только под другими названиями и с синтаксисом значками, а не словами. Разве что прямого аналога сечений и сопоставления с образцом вроде нет. Но сечение — это довольно редкая потребность на практике, которая к тому же вполне реализуема через что-то типа функтора. Ну а сопоставление с образцом оказалось совсем слабым (по сравнению с Прологом) — не намного сильнее какого-нибудь if/else...
И это я ещё не говорил про монады! Тут же наверное все знают что в Haskell по сути два отдельных языка. Он сам и ещё один встроеный, жутко кривой, по сути императивный язык для всего системного. В начале мне подобная идея показалась интересной — отделим весь "сомнительный" код от внутренней логики и т.п... Но когда я посмотрел (в примерах программ с GUI) к чему это приводит на практике... Ну вы наверное сами догадались, да? Вся программа — это одна "мегамонада". А самого "красивого" Хаскеля по сути вообще нет — только кривой код. А нафига тогда это вообще надо? Уж проще на Питоне, где и императивный и функционаьный код записываются в едином удобном стиле. И кстати монады огорчили ещё кое-чем. Зная что Хаскель компилируется в native, я надеялся что возможно будет путь для прямого вызова API OS. И он действительно по сути есть, но опять же только в этой кривой пародии на императивный язык. Конечно я понимаю что по другому и нельзя было (если хотим сохранять "чистоту"), но я надеялся на некое чудо. )))
Есть ещё конечно действительно особая вещь — ленивость. Но сценарии её использования действительно интересны лишь на различных абстракциях (типа бесконечных структур данных), а в остальных случаях неленивые решения ничем не уступают. В общем саму возможность ленивых вычислений на уровне языка безусловно записываем в плюс, но она даже близко не окупает остальные минусы языка.
В общем в итоге всего этого Haskell сполз для меня с мифического пьедестала (да, каюсь, это я сам воздвиг его, но в основном на основе окружающих слухов) супер языка и превратился в неудобную экспериментальную поделку... Теперь даже и не знаю где искать новую "серебряную пулю" для фана. Ну а о замене основных инструментов похоже пока даже и речи нет...
Ну что вам сказать... Вы не правы, потому что судите о Хаскеле исключительно с высоты своего опыта программирования на нем. И ваш опыт чрезмерно мал, чтобы ваша оценка была объективной и слишком эмоциональной. Единственное, в чем вы правы: язык, действительно, не такой сложный, как его малюют. Но на нем, как и на любом другом языке, очень легко написать г... плохой код, особенно если начать с GUI и не осознать, что такое "программирование в чистых функциях исключительно в функциональном стиле". Обычно весь предыдущий императивный опыт перекашивает программиста в сторону императивности. Программист неосознанно ищет в монаде IO то, к чему привык; конечно же, не находит, — и обламывается. И теперь все монады кажутся ему отдельным встроенным языком, да еще и невозможно кривым. А на самом деле более изящной вещи в программировании еще стоит поискать. Я не знаю, кого вы имели в виду под словами:
_>И это я ещё не говорил про монады! Тут же наверное все знают что в Haskell по сути два отдельных языка. _>Ну вы наверное сами догадались, да? Вся программа — это одна "мегамонада".
Ничего подобного. при правильном подходе к проектированию программы, любая монада прекрасно вписывается в остальной код и неотличима от него, потому как там все логично. Даже так напугавшая вас монада IO органично может быть частью чего-то большего. Просто смотрите достойные примеры, а изучение Haskell лучше начинать не с монад, а с принципов чистого функционального программирования. И тогда вы поймете, как разделить код на слои, чтобы не было одной мегамонады.
_>Те же генераторы, условия, шаблоны, только под другими названиями и с синтаксисом значками, а не словами.
О каких таких генераторах, шаблонах и условиях "с синтаксисом значками" идет речь? Вообще, тут в контексте беседы стоит упомянуть APL, и на том холиварную тему закрыть. (Но в скобках замечу, что ничто не мешает в Haskell делать синтаксис как со значками, так и словами. Зависит от предпочтений программиста.)
_>Ну а сопоставление с образцом оказалось совсем слабым (по сравнению с Прологом) — не намного сильнее какого-нибудь if/else..
Это заявление вообще является показателем, что вам не известны все возможности сопоставления с образцом.
Наконец, эта фраза:
_>А самого "красивого" Хаскеля по сути вообще нет — только кривой код.
как и все сообщение, является лишь вашим желанием похоливарить, ибо Haskell тут ни при чем. А при чем — исключительно руки, которые и пишут код.
Здравствуйте, alex_public, Вы писали:
_>- язык мегасложный, только для самых самых, но зато кто освоит, может творить невероятные вещи, недоступные в других языках
Когда я начал читать этот пост, подумал "ну вот, еще один всё понял" и хотел уже написать что-то вроде: "да, на самом деле Хаскель — довольно простой язык, про его сложность пишут в основном тролли с Лоа, и ничего `невероятного' там по сути нет, просто позволяет немного лучше структурировать код." Но когда дочитал до конца, сам начал в себе сомневаться. Похоже Хаскель действительно "affect the way you think about programming", и, похоже, действительно это недоступно ни в одном другом из перечисленных языков. Рекомендую почитать здесь http://www.paulgraham.com/avg.html про "Blub Paradox". Там про Лисп, но суть феномена отражена верно.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Похоже Хаскель действительно "affect the way you think about programming"
У меня так и было. Haskell серьезно изменил мое программистское мышление и повернул его в сторону, о которой я даже не подозревал. И это было приятное чувство, ни с чем не сравнимое.
Здравствуйте, alex_public, Вы писали:
_>А теперь подробнее... Для начала скажу что ничего сложного в нём так и не обнаружил — довольно простой и логичный язык.
Это правда. В то же время — не для всех "логичный" означает "простой", для многих всё наоборот. Отсюда и миф.
_>Те же генераторы, условия, шаблоны,
А нельзя поподробнее? Потому что пока я понимаю так:
1) Шаблоны — если имеются в виду шаблоны C++, то ничего близкого в Хаскеле нет. Шаблоны плюсов — это макросистема, откуда вытекают и их преимущества и их ограничения. Гораздо ближе дженерики из Java или C# — это, скажем так, подмножество хаскельного параметрического полиморфизма.
2) Условия — вообще не понял, о чём речь.
3) Генераторы — ничего похожего, опять-таки, в Хаскеле нет. Если речь идёт о чём-то вроде foldl, то это гораздо более мощная конструкция.
Я вполне допускаю, что понял неправильно, и прошу пояснить.
_>Ну а сопоставление с образцом оказалось совсем слабым (по сравнению с Прологом) — не намного сильнее какого-нибудь if/else...
Это сомнительное утверждение. Единственное преимущество Пролога в этом смысле (ЕМНИМЭ) — это возможность использовать две одинаковых переменных (что-нибудь вроде [X|X|R]). В Хаскеле это эмулируется как (x : x' : rest) | x' == x. Причина этому — то, что в прологе любые термы можно сравнить на равенство; в Хаскеле нельзя. Это, в свою очередь, следствие того, что в Хаскеле терм может оказаться, например, функцией — а функции ну никак не сравниваются. Поэтому Хаскель не предполагает по умолчанию, что к переменным паттерна применимо свойство "такой же, как этот".
_>И это я ещё не говорил про монады! Тут же наверное все знают что в Haskell по сути два отдельных языка.
Это неверно. Монады — всего лишь один из множества полезных классов Хаскеля. Отличаются они только тем, что для них предусмотрен лёгкий синтаксический сахар. Но пользоваться им необязательно.
_>Но когда я посмотрел (в примерах программ с GUI) к чему это приводит на практике...
Ну, если вся программа — только лишь GUI, то удивляться нечему. А в "примерах", скорее всего, так и есть. Это то самое "отделение сомнительной части от внутренней логики", только в учебных примерах по GUI-библиотекам внутренней логики, собственно, нет.
_>я надеялся что возможно будет путь для прямого вызова API OS. И он действительно по сути есть, но опять же только в этой кривой пародии на императивный язык. Конечно я понимаю что по другому и нельзя было (если хотим сохранять "чистоту"), но я надеялся на некое чудо. )))
Чудес не бывает. А хаскельный FFI считается одним из наиболее продуманных и удобных.
_>Но сценарии её использования действительно интересны лишь на различных абстракциях (типа бесконечных структур данных), а в остальных случаях неленивые решения ничем не уступают.
Это тоже не так. На самом деле, практически во всех энергичных (== во всех остальных) языках есть элементы ленивости — потому что без них никак. Как минимум, конструкция if...then...else является ленивой вообще везде. Операторы "и" и "или" практически везде тоже ленивы — не вычисляют второй аргумент, если первого достаточно. А, скажем, нормальный Y-комбинатор вообще в энергичных языках не встречается, да и не может.
Здравствуйте, MigMit, Вы писали:
MM>1) Шаблоны — если имеются в виду шаблоны C++, то ничего близкого в Хаскеле нет. Шаблоны плюсов — это макросистема, откуда вытекают и их преимущества и их ограничения. Гораздо ближе дженерики из Java или C# — это, скажем так, подмножество хаскельного параметрического полиморфизма.
template haskell?
_>>И это я ещё не говорил про монады! Тут же наверное все знают что в Haskell по сути два отдельных языка.
MM>Это неверно. Монады — всего лишь один из множества полезных классов Хаскеля. Отличаются они только тем, что для них предусмотрен лёгкий синтаксический сахар. Но пользоваться им необязательно.
Синтаксически ещё и стрелки подслащены.
Вы совсем не упомянули спарки (Control.Parallel par, pseq). Разве это не круто?
Re[2]: Мифический Haskell
От:
Аноним
Дата:
16.02.12 08:20
Оценка:
Здравствуйте, MigMit, Вы писали:
_>>Ну а сопоставление с образцом оказалось совсем слабым (по сравнению с Прологом) — не намного сильнее какого-нибудь if/else...
MM>Это сомнительное утверждение. Единственное преимущество Пролога в этом смысле (ЕМНИМЭ) — это возможность использовать две одинаковых переменных (что-нибудь вроде [X|X|R]). В Хаскеле это эмулируется как (x : x' : rest) | x' == x.
Все-таки в Прологе полноценная унификация, и она действительно мощнее паттерн-матчинга.
Здравствуйте, alex_public, Вы писали:
_> Но когда я посмотрел (в примерах программ с GUI) к чему это приводит на практике... Ну вы наверное сами догадались, да? Вся программа — это одна "мегамонада".
Спрашивается — а на кой хрен вообще программировать GUI на Хаскелле? Да еще используя биндинги к чужеродным библиотекам, а не родную для Хаскелля идеологию functional reactive programming? Для GUI есть всякие там Tcl/Tk, идеально под эту задачу заточенные.
_> А самого "красивого" Хаскеля по сути вообще нет — только кривой код. А нафига тогда это вообще надо? Уж проще на Питоне, где и императивный и функционаьный код записываются в едином удобном стиле.
Функциональный код на Питоне?!? Не смешите мои панталоны! Какой такой "функциональный" код на языке, где expression и statement это разные вещи?
_>В общем в итоге всего этого Haskell сполз для меня с мифического пьедестала (да, каюсь, это я сам воздвиг его, но в основном на основе окружающих слухов) супер языка и превратился в неудобную экспериментальную поделку... Теперь даже и не знаю где искать новую "серебряную пулю" для фана.
Человеку, программирующему гуйню, ничего сложнее Tcl и не нужно по определению. Меня, честно говоря, сильно удивляет, как это жирный и сложный C++ (он на порядок сложнее того же Хаскелля) оказался в списке ваших инструментов. Не гуйнячий же язык, совсем не гуйнячий.
Здравствуйте, http://palm-mute.livejournal.com/, Вы писали:
HPM>Здравствуйте, MigMit, Вы писали:
HPM>Все-таки в Прологе полноценная унификация, и она действительно мощнее паттерн-матчинга.
А сужение (narrowing) мощнее унификации?
Здравствуйте, alexlz, Вы писали:
A>Здравствуйте, MigMit, Вы писали:
MM>>1) Шаблоны — если имеются в виду шаблоны C++, то ничего близкого в Хаскеле нет. Шаблоны плюсов — это макросистема, откуда вытекают и их преимущества и их ограничения. Гораздо ближе дженерики из Java или C# — это, скажем так, подмножество хаскельного параметрического полиморфизма. A>template haskell?
Поправка принимается. Я о нём забыл (хотя можно, конечно, начать придираться и говорить, что в стандарт оно, дескать, не входит, и т.п... но заниматься иезуитством не будем). Однако, это не то, что я посоветую использовать новичку. Да и профи тоже.
_>>>И это я ещё не говорил про монады! Тут же наверное все знают что в Haskell по сути два отдельных языка.
MM>>Это неверно. Монады — всего лишь один из множества полезных классов Хаскеля. Отличаются они только тем, что для них предусмотрен лёгкий синтаксический сахар. Но пользоваться им необязательно. A>Синтаксически ещё и стрелки подслащены.
Ну, строго говоря, да. Но и только. Функторы не подслащены, аппликативные функторы тоже не подслащены, и т.п.
Здравствуйте, http://palm-mute.livejournal.com/, Вы писали:
HPM>Все-таки в Прологе полноценная унификация, и она действительно мощнее паттерн-матчинга.
Здравствуйте, Аноним, Вы писали:
А> Спрашивается — а на кой хрен вообще программировать GUI на Хаскелле?
А как же вкусные fudgets, formlets, прикручивание представлений с помошью тайпклассов, построение композитных интерфейсов с помошью комбинаторов и прочие ништяки?
А> Да еще используя биндинги к чужеродным библиотекам, а не родную для Хаскелля идеологию functional reactive programming?
Оно не исключает. Всё равно таргет — какая-нибудь нативная либа, сверху может быть прикручен frp.
А> Человеку, программирующему гуйню, ничего сложнее Tcl и не нужно по определению.
Ну нет. Вон даже в C# функциональную гуйню пытаются тянуть: http://linquid.codeplex.com/ Потому что действительно удобно. проблема написания гуйни на Хаскелле не в том, что `нинужно', а в том, что нормальных либ нет и все хаскеллевские GUI-фреймворки протухают еще до того, как их успевают дописать. А так, если бы была либа, которой бы постоянно занимались, было бы очень хорошо, конечно.
Здравствуйте, MigMit, Вы писали:
MM>1) Шаблоны — если имеются в виду шаблоны C++, то ничего близкого в Хаскеле нет.
Не вижу существенной разницы. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.78.2151. ИМХО разница в основном в синтаксисе и в том, что на шаблонах скорее всего не сделать что-нибудь вроде (a ~ b) => ... То как это внутри реализовано — так вообще детали и в хаскеле более менделенная реализация, хотя можно было бы сделать и быструю как в крестах (путём запрета раздельной компиляции и увеличения кол-ва сгенерированного кода).
Я лично просто не могу воспринимать язык с таким синтаксисом. Когда я вижу код на Хаскеле, я понимаю, что я в этом разбираться не хочу и не буду.
__________________________________
Не ври себе.
Re[4]: Мифический Haskell
От:
Аноним
Дата:
16.02.12 09:45
Оценка:
Здравствуйте, MigMit, Вы писали:
MM>Здравствуйте, http://palm-mute.livejournal.com/, Вы писали:
HPM>>Все-таки в Прологе полноценная унификация, и она действительно мощнее паттерн-матчинга.
MM>М-м-м... Care to elaborate?
А чего тут elaborate?
$ swipl
1 ?- foo(X, 2, 3) = foo(1, 2, Y).
X = 1,
Y = 3.
2 ?- X=Y, Y=Z, Z=42.
X = 42,
Y = 42,
Z = 42.
Re[4]: Мифический Haskell
От:
Аноним
Дата:
16.02.12 09:46
Оценка:
Здравствуйте, alexlz, Вы писали:
A>Здравствуйте, http://palm-mute.livejournal.com/, Вы писали:
HPM>>Здравствуйте, MigMit, Вы писали:
HPM>>Все-таки в Прологе полноценная унификация, и она действительно мощнее паттерн-матчинга. A>А сужение (narrowing) мощнее унификации?
Здравствуйте, Artifact, Вы писали:
A>Я лично просто не могу воспринимать язык с таким синтаксисом. Когда я вижу код на Хаскеле, я понимаю, что я в этом разбираться не хочу и не буду.
Старнное заявление в разделе /decl. Вроде у всех более-менее декларативных и функциональны эзыков синтаксис весьма далёк от сишкоподобного. Если, конечно, это не эрзацы вроде Скалы или Менерле.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, MigMit, Вы писали:
MM>>1) Шаблоны — если имеются в виду шаблоны C++, то ничего близкого в Хаскеле нет.
ПМ>Не вижу существенной разницы. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.78.2151. ИМХО разница в основном в синтаксисе и в том, что на шаблонах скорее всего не сделать что-нибудь вроде (a ~ b) => ... То как это внутри реализовано — так вообще детали и в хаскеле более менделенная реализация, хотя можно было бы сделать и быструю как в крестах (путём запрета раздельной компиляции и увеличения кол-ва сгенерированного кода).
Разница в том, что в Хаскеле — нормальный ПП (с явной передачей словаря), а в плюсах — макросистема.
Здравствуйте, http://palm-mute.livejournal.com/, Вы писали:
HPM>Здравствуйте, MigMit, Вы писали:
MM>>Здравствуйте, http://palm-mute.livejournal.com/, Вы писали:
HPM>>>Все-таки в Прологе полноценная унификация, и она действительно мощнее паттерн-матчинга.
MM>>М-м-м... Care to elaborate?
HPM>А чего тут elaborate?
А, в этом смысле. Понял. Но тут, скорее, играет "двустороннесть" правил пролога, это не относится именно к ПМ.