LINUX.ORG.RU

Хаскель: возвращение LOR-contest


0

0

Вот, было немного свободного времени, захотел покрутить Хаскель. Сам учебник был прочтен быстро, решил попробовать какую-нибудь задачку посложнее. В результате вспомнил о LOR-contest:

http://www.linux.org.ru/wiki/en/LOR-contest

Само решение было написано за день. Правда, по памяти задачу вспомнил неточно, потому кое-что не сделано, например, нормальный ввод-вывод. Кроме того, не было под рукой сетевых библиотек, равно, как и Internet, потому сетевой подсистемы тоже нет.

В целом, получилось намного лучше, чем я ожидал. Даже если добавить сеть и допилить вывод, то будет где-то даже лучше Ocaml. Статическая типизация очень понравилась -- после Python и JavaScript рефакторить код (а это неотъемлемая часть задачи) одно удовольствие. Из недостатков могу отметить отсутствие рефлексии (возможность встроить REPL в интерфейс, как в Lisp) и метапрограммирования (возможность генерировать тела функций). Впрочем, не исключено, что последнее я просто ниасилил.

Думал, как прикрутить STM (особенно, к волновому алгоритму) -- немного задалбывает гонять весь мир в функциях на вход и выход. Но потом как-то взвесил, и решил оставить, как есть.

В общем, если есть энтузиасты-знатоки, можете допилить код до полного соответствия правилам. У меня просто закончился лимит времени на самообучение.

Лично мне интересно будет посмотреть на считалку на Хаскеле, и, возможно, решение на Erlang.

P.S. При восстановлении старых результатов не смог восстановить версии на Python и Ocaml с хорошими характеристиками. Если найдутся дотошные -- пусть меня поправят. Если ошибки в замерах и есть, то они исключительно по недоразумению, а не от желания пропиарить одни языки в ущерб другим. В общем, делайте замечания -- поправим.

Лан, как будет время, реанимирую версию на быдлопитоне, а потом можно и за быдлоэрланг взяться.

anonymous
()

Ух-ты, это даже увековечено на wiki LOR.

В ближайшее время попытаюсь восстановить последнюю версию на OCaml.

На wiki ты также упоминаешь о решении с расширением .k . Это на языке K (http://en.wikipedia.org/wiki/K_%28programming_language%29), наследнике APL. К сожалению, сколько бы мы на lisp/python/ocaml не старались, языки этого семейства (APL, J, K) нам не переплюнуть :)

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

> Ух-ты, это даже увековечено на wiki LOR.

Да мною же и увековечено. Причем, сегодня. Бо тема, смотрю, популярная. Тут вон в соседнем топике задачка про ферзей упоминается, тоже интересная. Но там на скорость исполнения и разработки меряются.

> наследнике APL. К сожалению, сколько бы мы на lisp/python/ocaml не старались, языки этого семейства (APL, J, K) нам не переплюнуть :)

Да, я увлекался APL/J в середине 90-х, даже написал пару полезных приблуд на J. Однвко, вот пока учил Хаскель, возникло стойкое ощущение, что он прямой наследник APL/J -- примерно тот же подход к написанию. Так что, возможно, Хаскель и доплюнет :-).

Плохо, что "K is a proprietary array processing language". Я так понял, проверить работоспособность этой штуки не получится? Плохо, по тем же причинам был зарублен LispWorks, а на нем решение тоже было короткое.

eugine_kosenko ★★★
() автор топика

Ой, а мы уже почти целый сетевой рогалик на Лиспе написали, с генератором карт даже )) Клиент правда на Си. Может поможешь, если есть желание?

anonymous
()

> Думал, как прикрутить STM (особенно, к волновому алгоритму)

Software Transactional Memory? Scanning tunneling microscope? Société de transport de Montréal?

anonymous
()

> отсутствие рефлексии

Посмотри на Data.Typeable, Data.Generics.

> и метапрограммирования

Template Haskell.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

> Template Haskell.

На любые извращения готовы разработчики хаскеля, лишь бы не делать типы объектами первого класса.

anonymous
()
Ответ на: комментарий от Miguel

>> отсутствие рефлексии

> Посмотри на Data.Typeable, Data.Generics. 

А оно поможет сократить вот этот вот дешифратор:

      applyCommand world str =
          case str of
            "up" -> step toUp
            "down" -> step toDown
            "left" -> step toLeft
            "right" -> step toRight
            "take" -> grab True delete
            "drop" -> grab False (:)
            "reset" -> initial
            "collect" -> applyProgram (bringAll world) world initial
            otherwise -> world

?

Судя по доке, похоже, но как это применить -- для меня больной вопрос...

eugine_kosenko ★★★
() автор топика
Ответ на: комментарий от anonymous

> Software Transactional Memory? Scanning tunneling microscope? Société de transport de Montréal?

State Monad

:-)

eugine_kosenko ★★★
() автор топика
Ответ на: комментарий от anonymous

> целый сетевой рогалик

wtf?

> Может поможешь, если есть желание?

Желание есть, времени нет :-). Разве что, JFF. А что делать?

eugine_kosenko ★★★
() автор топика
Ответ на: комментарий от eugine_kosenko

>Желание есть, времени нет :-)

У нас и по-мелочи есть дела.

>А что делать?

дать свой jabber

anonymous
()

Забавно, попробую написать на Scala.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

> А разница особо существенна? :)

Я так и не научился работать с ним через обычные IM-клиенты. К тому же после падения пиджина окончательно ушел в Web.

eugine_kosenko ★★★
() автор топика
Ответ на: комментарий от eugine_kosenko

У меня Пиджин прекрасно с гтолком работает. Уже несколько месяцев на нем сижу и "не единого разрыва".

Sidrian
()
Ответ на: комментарий от eugine_kosenko

> Как я понял, оно в экстеншнах, да еще и экспериментальное пока, да?

Оно ghc-only, но довольно устойчивое.

Miguel ★★★★★
()

-genOrder p1 p2 = compare (findGen p1) (findGen p2)
+genOrder = compare `on` findGen

-getProgram = do
- str <- getLine
- return (words str)
+ getProgram = getLine >>= words

А вообще - все менять, будет время - попробую нормально переписать

imp ★★
()
Ответ на: комментарий от imp

Зачотно :-).

Про `on` не знал, а с do-нотацией мог бы догадаться, но сработали стереотипы :-).

> А вообще - все менять, будет время - попробую нормально переписать

Будет интересно взглянуть на полную версию :-).

eugine_kosenko ★★★
() автор топика
Ответ на: комментарий от eugine_kosenko

> Это заглушки?

Да

>А клиент будет?

Да

А вообще можно телнетом потестить на порт - понимает комманды:

read world

south

north

east

west

exit

imp ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.