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 прочтите, осмыслите, а потом возвращайтесь. То, что вы не смогли осилить язык, не означает, что он плох.
UFO just landed and posted this here
Конечно, он неидеален. Знаете высказывание Страусступа? «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