Мифический Haskell
От: alex_public  
Дата: 16.02.12 01:57
Оценка: 23 (6) +5 -1
Не сразу решился написать это сообщение, т.к. подозреваю что часть народа воспримет его как повод для "войн". Но я всё же надеюсь что большая часть читателей (а особенно модераторы ) поймут что это истинные эмоции, а не "провокация войны" какая-то.

Т.к. об этом всё равно спросят, то напиши сразу: мои (и моих команд) основные инструменты в реальной работе это 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 сполз для меня с мифического пьедестала (да, каюсь, это я сам воздвиг его, но в основном на основе окружающих слухов) супер языка и превратился в неудобную экспериментальную поделку... Теперь даже и не знаю где искать новую "серебряную пулю" для фана. Ну а о замене основных инструментов похоже пока даже и речи нет...
Re: Мифический Haskell
От: graninas Россия https://github.com/graninas
Дата: 16.02.12 02:32
Оценка: +4 -2
Здравствуйте, alex_public, Вы писали:

Ну что вам сказать... Вы не правы, потому что судите о Хаскеле исключительно с высоты своего опыта программирования на нем. И ваш опыт чрезмерно мал, чтобы ваша оценка была объективной и слишком эмоциональной. Единственное, в чем вы правы: язык, действительно, не такой сложный, как его малюют. Но на нем, как и на любом другом языке, очень легко написать г... плохой код, особенно если начать с GUI и не осознать, что такое "программирование в чистых функциях исключительно в функциональном стиле". Обычно весь предыдущий императивный опыт перекашивает программиста в сторону императивности. Программист неосознанно ищет в монаде IO то, к чему привык; конечно же, не находит, — и обламывается. И теперь все монады кажутся ему отдельным встроенным языком, да еще и невозможно кривым. А на самом деле более изящной вещи в программировании еще стоит поискать. Я не знаю, кого вы имели в виду под словами:

_>И это я ещё не говорил про монады! Тут же наверное все знают что в Haskell по сути два отдельных языка.

_>Ну вы наверное сами догадались, да? Вся программа — это одна "мегамонада".

Ничего подобного. при правильном подходе к проектированию программы, любая монада прекрасно вписывается в остальной код и неотличима от него, потому как там все логично. Даже так напугавшая вас монада IO органично может быть частью чего-то большего. Просто смотрите достойные примеры, а изучение Haskell лучше начинать не с монад, а с принципов чистого функционального программирования. И тогда вы поймете, как разделить код на слои, чтобы не было одной мегамонады.

_>Те же генераторы, условия, шаблоны, только под другими названиями и с синтаксисом значками, а не словами.


О каких таких генераторах, шаблонах и условиях "с синтаксисом значками" идет речь? Вообще, тут в контексте беседы стоит упомянуть APL, и на том холиварную тему закрыть. (Но в скобках замечу, что ничто не мешает в Haskell делать синтаксис как со значками, так и словами. Зависит от предпочтений программиста.)

_>Ну а сопоставление с образцом оказалось совсем слабым (по сравнению с Прологом) — не намного сильнее какого-нибудь if/else..


Это заявление вообще является показателем, что вам не известны все возможности сопоставления с образцом.

Наконец, эта фраза:

_>А самого "красивого" Хаскеля по сути вообще нет — только кривой код.


как и все сообщение, является лишь вашим желанием похоливарить, ибо Haskell тут ни при чем. А при чем — исключительно руки, которые и пишут код.

С уважением
Re: Мифический Haskell
От: Паблик Морозов  
Дата: 16.02.12 06:29
Оценка:
Здравствуйте, alex_public, Вы писали:

_>- язык мегасложный, только для самых самых, но зато кто освоит, может творить невероятные вещи, недоступные в других языках


Когда я начал читать этот пост, подумал "ну вот, еще один всё понял" и хотел уже написать что-то вроде: "да, на самом деле Хаскель — довольно простой язык, про его сложность пишут в основном тролли с Лоа, и ничего `невероятного' там по сути нет, просто позволяет немного лучше структурировать код." Но когда дочитал до конца, сам начал в себе сомневаться. Похоже Хаскель действительно "affect the way you think about programming", и, похоже, действительно это недоступно ни в одном другом из перечисленных языков. Рекомендую почитать здесь http://www.paulgraham.com/avg.html про "Blub Paradox". Там про Лисп, но суть феномена отражена верно.
Re[2]: Мифический Haskell
От: graninas Россия https://github.com/graninas
Дата: 16.02.12 06:37
Оценка: +2
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Похоже Хаскель действительно "affect the way you think about programming"


У меня так и было. Haskell серьезно изменил мое программистское мышление и повернул его в сторону, о которой я даже не подозревал. И это было приятное чувство, ни с чем не сравнимое.
Re: Мифический Haskell
От: MigMit Россия http://migmit.vox.com
Дата: 16.02.12 07:08
Оценка: 4 (2) +1 -1
Здравствуйте, 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-комбинатор вообще в энергичных языках не встречается, да и не может.
Re[2]: Мифический Haskell
От: alexlz  
Дата: 16.02.12 08:04
Оценка:
Здравствуйте, MigMit, Вы писали:

MM>1) Шаблоны — если имеются в виду шаблоны C++, то ничего близкого в Хаскеле нет. Шаблоны плюсов — это макросистема, откуда вытекают и их преимущества и их ограничения. Гораздо ближе дженерики из Java или C# — это, скажем так, подмножество хаскельного параметрического полиморфизма.

template haskell?

_>>И это я ещё не говорил про монады! Тут же наверное все знают что в Haskell по сути два отдельных языка.


MM>Это неверно. Монады — всего лишь один из множества полезных классов Хаскеля. Отличаются они только тем, что для них предусмотрен лёгкий синтаксический сахар. Но пользоваться им необязательно.

Синтаксически ещё и стрелки подслащены.
Re: Мифический Haskell
От: Temoto  
Дата: 16.02.12 08:11
Оценка:
Вы совсем не упомянули спарки (Control.Parallel par, pseq). Разве это не круто?
Re[2]: Мифический Haskell
От: Аноним  
Дата: 16.02.12 08:20
Оценка:
Здравствуйте, MigMit, Вы писали:


_>>Ну а сопоставление с образцом оказалось совсем слабым (по сравнению с Прологом) — не намного сильнее какого-нибудь if/else...


MM>Это сомнительное утверждение. Единственное преимущество Пролога в этом смысле (ЕМНИМЭ) — это возможность использовать две одинаковых переменных (что-нибудь вроде [X|X|R]). В Хаскеле это эмулируется как (x : x' : rest) | x' == x.


Все-таки в Прологе полноценная унификация, и она действительно мощнее паттерн-матчинга.
Re: Мифический Haskell
От: Аноним  
Дата: 16.02.12 08:39
Оценка: 1 (1) -1
Здравствуйте, alex_public, Вы писали:

_> Но когда я посмотрел (в примерах программ с GUI) к чему это приводит на практике... Ну вы наверное сами догадались, да? Вся программа — это одна "мегамонада".


Спрашивается — а на кой хрен вообще программировать GUI на Хаскелле? Да еще используя биндинги к чужеродным библиотекам, а не родную для Хаскелля идеологию functional reactive programming? Для GUI есть всякие там Tcl/Tk, идеально под эту задачу заточенные.

_> А самого "красивого" Хаскеля по сути вообще нет — только кривой код. А нафига тогда это вообще надо? Уж проще на Питоне, где и императивный и функционаьный код записываются в едином удобном стиле.


Функциональный код на Питоне?!? Не смешите мои панталоны! Какой такой "функциональный" код на языке, где expression и statement это разные вещи?

_>В общем в итоге всего этого Haskell сполз для меня с мифического пьедестала (да, каюсь, это я сам воздвиг его, но в основном на основе окружающих слухов) супер языка и превратился в неудобную экспериментальную поделку... Теперь даже и не знаю где искать новую "серебряную пулю" для фана.


Человеку, программирующему гуйню, ничего сложнее Tcl и не нужно по определению. Меня, честно говоря, сильно удивляет, как это жирный и сложный C++ (он на порядок сложнее того же Хаскелля) оказался в списке ваших инструментов. Не гуйнячий же язык, совсем не гуйнячий.
Re[3]: Мифический Haskell
От: alexlz  
Дата: 16.02.12 08:58
Оценка:
Здравствуйте, http://palm-mute.livejournal.com/, Вы писали:

HPM>Здравствуйте, MigMit, Вы писали:


HPM>Все-таки в Прологе полноценная унификация, и она действительно мощнее паттерн-матчинга.

А сужение (narrowing) мощнее унификации?
Re[3]: Мифический Haskell
От: MigMit Россия http://migmit.vox.com
Дата: 16.02.12 09:13
Оценка:
Здравствуйте, alexlz, Вы писали:

A>Здравствуйте, MigMit, Вы писали:


MM>>1) Шаблоны — если имеются в виду шаблоны C++, то ничего близкого в Хаскеле нет. Шаблоны плюсов — это макросистема, откуда вытекают и их преимущества и их ограничения. Гораздо ближе дженерики из Java или C# — это, скажем так, подмножество хаскельного параметрического полиморфизма.

A>template haskell?

Поправка принимается. Я о нём забыл (хотя можно, конечно, начать придираться и говорить, что в стандарт оно, дескать, не входит, и т.п... но заниматься иезуитством не будем). Однако, это не то, что я посоветую использовать новичку. Да и профи тоже.

_>>>И это я ещё не говорил про монады! Тут же наверное все знают что в Haskell по сути два отдельных языка.


MM>>Это неверно. Монады — всего лишь один из множества полезных классов Хаскеля. Отличаются они только тем, что для них предусмотрен лёгкий синтаксический сахар. Но пользоваться им необязательно.

A>Синтаксически ещё и стрелки подслащены.

Ну, строго говоря, да. Но и только. Функторы не подслащены, аппликативные функторы тоже не подслащены, и т.п.
Re[3]: Мифический Haskell
От: MigMit Россия http://migmit.vox.com
Дата: 16.02.12 09:14
Оценка:
Здравствуйте, http://palm-mute.livejournal.com/, Вы писали:

HPM>Все-таки в Прологе полноценная унификация, и она действительно мощнее паттерн-матчинга.


М-м-м... Care to elaborate?
Re[2]: Мифический Haskell
От: Паблик Морозов  
Дата: 16.02.12 09:21
Оценка: 1 (1) +2
Здравствуйте, Аноним, Вы писали:

А> Спрашивается — а на кой хрен вообще программировать GUI на Хаскелле?


А как же вкусные fudgets, formlets, прикручивание представлений с помошью тайпклассов, построение композитных интерфейсов с помошью комбинаторов и прочие ништяки?

А> Да еще используя биндинги к чужеродным библиотекам, а не родную для Хаскелля идеологию functional reactive programming?


Оно не исключает. Всё равно таргет — какая-нибудь нативная либа, сверху может быть прикручен frp.

А> Человеку, программирующему гуйню, ничего сложнее Tcl и не нужно по определению.


Ну нет. Вон даже в C# функциональную гуйню пытаются тянуть: http://linquid.codeplex.com/ Потому что действительно удобно. проблема написания гуйни на Хаскелле не в том, что `нинужно', а в том, что нормальных либ нет и все хаскеллевские GUI-фреймворки протухают еще до того, как их успевают дописать. А так, если бы была либа, которой бы постоянно занимались, было бы очень хорошо, конечно.
Re[2]: Мифический Haskell
От: Паблик Морозов  
Дата: 16.02.12 09:31
Оценка:
Здравствуйте, MigMit, Вы писали:

MM>1) Шаблоны — если имеются в виду шаблоны C++, то ничего близкого в Хаскеле нет.


Не вижу существенной разницы. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.78.2151. ИМХО разница в основном в синтаксисе и в том, что на шаблонах скорее всего не сделать что-нибудь вроде (a ~ b) => ... То как это внутри реализовано — так вообще детали и в хаскеле более менделенная реализация, хотя можно было бы сделать и быструю как в крестах (путём запрета раздельной компиляции и увеличения кол-ва сгенерированного кода).
Re: Мифический Haskell
От: Artifact  
Дата: 16.02.12 09:45
Оценка: :)
Здравствуйте, alex_public, Вы писали:

Я лично просто не могу воспринимать язык с таким синтаксисом. Когда я вижу код на Хаскеле, я понимаю, что я в этом разбираться не хочу и не буду.
__________________________________
Не ври себе.
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) мощнее унификации?

А что такое narrowing?
Re[2]: Мифический Haskell
От: Паблик Морозов  
Дата: 16.02.12 09:58
Оценка: -2
Здравствуйте, Artifact, Вы писали:

A>Я лично просто не могу воспринимать язык с таким синтаксисом. Когда я вижу код на Хаскеле, я понимаю, что я в этом разбираться не хочу и не буду.


Старнное заявление в разделе /decl. Вроде у всех более-менее декларативных и функциональны эзыков синтаксис весьма далёк от сишкоподобного. Если, конечно, это не эрзацы вроде Скалы или Менерле.
Re[3]: Мифический Haskell
От: MigMit Россия http://migmit.vox.com
Дата: 16.02.12 10:30
Оценка: -1
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Здравствуйте, MigMit, Вы писали:


MM>>1) Шаблоны — если имеются в виду шаблоны C++, то ничего близкого в Хаскеле нет.


ПМ>Не вижу существенной разницы. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.78.2151. ИМХО разница в основном в синтаксисе и в том, что на шаблонах скорее всего не сделать что-нибудь вроде (a ~ b) => ... То как это внутри реализовано — так вообще детали и в хаскеле более менделенная реализация, хотя можно было бы сделать и быструю как в крестах (путём запрета раздельной компиляции и увеличения кол-ва сгенерированного кода).


Разница в том, что в Хаскеле — нормальный ПП (с явной передачей словаря), а в плюсах — макросистема.
Re[5]: Мифический Haskell
От: MigMit Россия http://migmit.vox.com
Дата: 16.02.12 10:32
Оценка:
Здравствуйте, http://palm-mute.livejournal.com/, Вы писали:

HPM>Здравствуйте, MigMit, Вы писали:


MM>>Здравствуйте, http://palm-mute.livejournal.com/, Вы писали:


HPM>>>Все-таки в Прологе полноценная унификация, и она действительно мощнее паттерн-матчинга.


MM>>М-м-м... Care to elaborate?


HPM>А чего тут elaborate?


А, в этом смысле. Понял. Но тут, скорее, играет "двустороннесть" правил пролога, это не относится именно к ПМ.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.