Comments 21
Каждый ***** по своему…
на самом деле интерес к хаскелу действительно возрос)
не сломайте глаза, выужено их архивов без форматирования, изначально было в виде лямбды
{import IO; import Network; main= do{so
{import IO; import Network; main= do{so
парсер съел. pastebin.com/B1jA5ZP7
какой то неуверенный хайлайт кода, может поярче?
> надеюсь, у кого-нибудь дополнительный интерес к Haskell пробудило, или поубавило скептицизма относительно бесполезности функциональных приблуд.
на самом деле, нифига подобного.
я, имея, за плечами половину «real world haskell», потерял нить уже через пару абзацев.
подумалось: ну нифига ж себе, какой оказывается геморрой написать простой сервер на хаскеле.
на самом деле, хаскель просто выворачивает наизнанку весь подход к программированию. прочитав упомянутые 8 глав RWH, я всё же вернулся к питону — там есть элементы ФП, но в более «человеческом» виде.
на самом деле, нифига подобного.
я, имея, за плечами половину «real world haskell», потерял нить уже через пару абзацев.
подумалось: ну нифига ж себе, какой оказывается геморрой написать простой сервер на хаскеле.
на самом деле, хаскель просто выворачивает наизнанку весь подход к программированию. прочитав упомянутые 8 глав RWH, я всё же вернулся к питону — там есть элементы ФП, но в более «человеческом» виде.
Сначала полностью RWH прочтите, осмыслите, а потом возвращайтесь. То, что вы не смогли осилить язык, не означает, что он плох.
Конечно, он неидеален. Знаете высказывание Страусступа? «There are only two types of programming languages: those, everyone bitches and those nobody uses.»
Но это не значит, что он «выворачивает подход» и имеет «нечеловеческий» вид. Вы ведь не говорите, что использование дрели извращает подход к нормальному забиванию гвоздей?
Но это не значит, что он «выворачивает подход» и имеет «нечеловеческий» вид. Вы ведь не говорите, что использование дрели извращает подход к нормальному забиванию гвоздей?
> То, что вы не смогли осилить язык, не означает, что он плох.
абсолютно согласен. язык я не осилил, по крайней мере с первого подхода.
я прос то указываю на то, что ваша статья не расчитана на неподготовленного читателя, у которого вы хотите пробудить интерес.
также из приведённого примера не видно, чем именно функциональный подход лучше.
абсолютно согласен. язык я не осилил, по крайней мере с первого подхода.
я прос то указываю на то, что ваша статья не расчитана на неподготовленного читателя, у которого вы хотите пробудить интерес.
также из приведённого примера не видно, чем именно функциональный подход лучше.
Хаслекль не единстевнный функциональный язык, система типов, и компилятор очень навороченный и программа по сути = виртуальная машина которая упаковывается в экзешник с вашим приложением. АТД и лень тоже интересны, НО то что он ЧИСТО ФУНКЦИОНАЛЬНЫЙ и для множества простых вещей нужно работать с монадами ЕГО ГРОБИТ. Erlang, F#, Scala гораздо более человечны. Точно такой же сервер на эрланге описан в блоге Joe Armstrong, и его исходники гораздо понятнее человеку не знакомому с эрлангом или с функциональным программированием в принципе.
Я придерживаюсь прямо противоположного мнения. Чего стоит впихивание в языки всяких конструкций для асинхронного ввода-вывода, тогда как это всё выражается в терминах монад.
А не получится, как с C++?
В C++ как раз намешано очень много.
А так сами сравните, десяток вложенных foreach или
Куча проверок на null или
Вызывать на каждом ходу BeginSmth с передачей callback'а, или
Вот с чем действительно у Хаскеля непорядок, так это с трансформерами монад. Они не вписываются органично и потому
А так сами сравните, десяток вложенных foreach или
do
fileName <- enumDirectory "."
line <- readLines fileName
word <- words line
if word == "bla" then ... else ...
Куча проверок на null или
do
f <- findSmth
r <- doSmthWith f
return (f, r)
Вызывать на каждом ходу BeginSmth с передачей callback'а, или
do
f <- download "file1"
g <- download "file2"
return (length f == length g)
Вот с чем действительно у Хаскеля непорядок, так это с трансформерами монад. Они не вписываются органично и потому
ExceptionalT String (StateT Int IO) a
смотрится жутко.Протокол, к слову, очень простой. Клиент шлёт случайные ключи, сервер в ответ подтверждает соединение, отсылая md5 от конкатенации этих ключей.
Если бы так было бы просто, они бы эти ключи не добавляли=)
Клиент шлет два ключа + случайное тело запроса. Сервер выкидывает из ключа все кроме цифр, получившееся десятеричное число делит на кол-во пробелов в ключе. Новое число разбивается на байты и записывается как строка. Объединяется с подобным числом от другого ключа и с телом запроса клиента… и для всей этой байтной мути еще и md5 высчитывается. Вообщем знают толк в извращениях.
Кстати создание ответа клиенту намного интереснее чем передача сообщений :D
Отлично, ну просто замечательно. :)
Правда, мне непонятно, зачем нужен трюк с fixIO: не могу найти вхождений [s] в [\s -> ...]. Что я не замечаю?
Правда, мне непонятно, зачем нужен трюк с fixIO: не могу найти вхождений [s] в [\s -> ...]. Что я не замечаю?
Sign up to leave a comment.
WebSocket сервер на Haskell