Home
Objective Caml
ocaml@conference.jabber.ru
Суббота, 16 октября 2010< ^ >
f[x] установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Верблюды грязи не боятся! | release crap | judge by commits, not comments | ocaml мёртв, move on | Oh My God! They Killed Kamlp4! Bastards!
Конфигурация комнаты
Участники комнаты

GMT+4
[00:11:12] ermine вышел(а) из комнаты
[00:26:52] Typhon вышел(а) из комнаты: Replaced by new connection
[00:26:55] Typhon вошёл(а) в комнату
[00:27:07] Typhon вышел(а) из комнаты
[00:27:17] <Kakadu> # value f x = match x with
  [ (true,true) -> true | (false,_) -> false ];
Error: Variable true is bound several times in this matching
[00:27:23] Typhon вошёл(а) в комнату
[00:27:37] <Kakadu> Мне кажется такую ошибку всётаки не надо выдавать компилятору
[00:28:22] <Kakadu> если там две переменные, то ещё ладно, а две давно известные константы он должен проглатывать
[00:38:56] <gds> Kakadu: это же revised!  там True/False с большой буквы, как нормальные конструкторы (чем они и являются по сути).
[00:40:40] <Kakadu> gds: o, это многое объясняет. Я тут просто учусь писать на revised...
[00:42:43] Typhon вышел(а) из комнаты
[00:43:11] <Kakadu> может там появилась какая-нибудь вкусняшка типа | ... when ((x mod 2) as q) = 0 -> ... ?
[00:43:37] <gds> полезно, так как поймёшь, что именно больше по нраву.
а именно такового не появилось точно.
[00:59:03] <gds> а насчёт типа-вложенных, а то и ленивых match -- были какие-то расширения.  типа "active patterns" или "views", что ли.
Лично я в подобных случаях (хитрые паттерны) разворачиваю match так, чтобы обойтись без when, что значит чаще дополнительный if, реже дополнительный match, и иногда приходится определять функцию типа let ret () = My_fkng_val (a, [zeta::acc], mu) in .., чтобы из нескольких веток дёргать её как ret ().
[01:00:12] <Kakadu> яснл
[01:00:14] <Kakadu> ясно
[01:00:28] <Kakadu> просто я сейчас пытаюсь балансировать между эффективностью и читаемстью
[01:00:46] <Kakadu> а то я тут написал нормально прогу
[01:01:03] <Kakadu> а олимпиадный программист написал нечитаемо, но эффективно.
[01:01:13] <Kakadu> а преподу ег вариант больше понравился
[01:01:31] <gds> эффективность против читаемости -- вроде к самому паттерн-матчингу мало относится.
препода убей и сожги его кости.
[01:01:53] arhibot вошёл(а) в комнату
[01:02:01] <Kakadu> ну тогда у нас на кафедре преподавать функционально е программирование будет некому
[01:08:39] <gds> тут ещё как посмотреть на эффективность и модифицируемость.  Если O-оценка отличается, то олимпиадник заслуживает жить (но в этом случае можно его же код реализовать по-человечески).  Если O-оценка одинаковая, и отличие только на константу, то с этим можно что-то поделать дипломатически.
Кстати, я, как-то раз, в 10м классе на республиканской олимпиаде выдал 15 страниц самого нечитаемого ку-бейсика, который только возможен (против меня были сишники и паскалисты), нагло взял первое место, а потом 1. мне было стыдно за говнокод, где-то через два месяца, 2. с тех пор я осторожно подхожу к вопросу "а не хочешь ли покодить в авральном режиме?".
[01:11:53] <gds> в общем, олимпиадники обычно говнюки, я как-то так хотел сказать, но нужных слов не мог найти.
[01:13:18] <komar> Выше этого сообщения не читал, но согласен.
[01:13:45] <gds> и это хорошо, что не читал.  пронесло.
[01:14:28] <komar> О, ты ходил на олимпиады в школе?
[01:14:33] <komar> ппц бабой щитать буду
[01:14:56] gds делает глазки
[01:16:00] <gds> это было давно и неправда.  А ещё я 4 года кодил на zx80, и что, я после этого вообще ахтунг?
[01:16:17] <komar> zx80 не позорно.
[01:17:15] <gds> но на олимпиадах было интересно, мозги поразмять можно было на отличненько.  Да и никто не прикапывался там, тоже плюс.
[01:19:09] gds вышел(а) из комнаты
[01:24:24] Kakadu вышел(а) из комнаты
[01:26:05] Typhon вошёл(а) в комнату
[01:50:38] arhibot вышел(а) из комнаты
[02:06:19] zert вышел(а) из комнаты
[02:12:06] Typhon вышел(а) из комнаты
[09:47:22] serp256 вошёл(а) в комнату
[09:52:59] serp256 вышел(а) из комнаты
[10:03:11] Kakadu вошёл(а) в комнату
[10:49:58] Kakadu вышел(а) из комнаты
[11:01:12] iNode вошёл(а) в комнату
[11:05:03] Kakadu вошёл(а) в комнату
[11:11:53] Kakadu вышел(а) из комнаты
[11:15:03] Kakadu вошёл(а) в комнату
[11:56:01] iNode вышел(а) из комнаты
[12:01:11] arhibot вошёл(а) в комнату
[12:08:43] SerP вошёл(а) в комнату
[12:08:59] SerP вышел(а) из комнаты
[12:12:07] ygrek вошёл(а) в комнату
[12:25:38] serp256 вошёл(а) в комнату
[12:36:01] <Kakadu> а в 3.11.2 можно в замыкании определять модули?
[12:39:23] serp256 вышел(а) из комнаты
[12:39:45] serp256 вошёл(а) в комнату
[12:40:10] <Kakadu> по-видимому нет... http://caml.inria.fr/pub/docs/manual-ocaml/manual021.html
[12:47:14] <ygrek> # let f x = fun y -> let module M = struct let g z = x + z end in M.g (y * 2);;
val f : int -> int -> int = <fun>
[12:48:45] serp256 вышел(а) из комнаты
[12:51:15] <Kakadu> ygrek: спасибо, получилось
[13:00:42] gds вошёл(а) в комнату
[13:07:58] arhibot вышел(а) из комнаты
[13:10:23] arhibot вошёл(а) в комнату
[13:14:36] arhibot вышел(а) из комнаты
[13:14:37] <Kakadu> USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
kakadu    4226  5.3 74.2 2983212 2953152 pts/2 S+   11:24   5:58      \_ /usr/bin/ocamlrun ...
[13:14:46] <Kakadu> я быдло программист
[13:15:12] <gds> 3 гига откушал?  нормально :)
[13:15:37] <Kakadu> вот что значит мемоизация
[13:38:40] Typhon вошёл(а) в комнату
[13:47:17] gds вышел(а) из комнаты
[14:02:14] <Kakadu> value rec foo () = try
     ...; foo ()
with [...]
(* Выдает stack overflow. Походу это не хвостовая рекурсия. *)
[14:02:37] <Kakadu> хотя она вглядит дик
[14:02:40] <Kakadu> дико*
[14:02:57] <Kakadu> value rec foo () = try
     ...; if ... then 1 else foo ()
with [...]
[14:03:09] <Kakadu> так не будет кажаться что рекурсия вечная
[14:08:48] <ygrek> try with это фрейм на стеке -> откусывать хвост нельзя
[14:38:47] gds вошёл(а) в комнату
[14:50:38] <gds> Kakadu: часто можно такое развернуть в хвостовую рекурсию.  Если не догадаешься, покажи код, посоветую что-нибудь.
[15:01:29] <Kakadu> gds: спасибо, не надо. Я догадался примерно как это сделать, но мне просто впадлу
[15:02:50] arhibot вошёл(а) в комнату
[15:41:13] <gds> видимо я туплю, но зачем Lwt.catch берёт первым аргументом задержанный вызов функции (т.е. (unit -> 'a t))?  Не пофиг ли, когда совершать вызов -- в тот момент, когда захочет catch (как сейчас), или тогда, когда захочет пользователь (как бы если бы сам пользователь вызвал arg (), получив в случае ошибки значение с типом 'a t, которое мог бы и сам получить, вызвав Lwt.fail)?
[15:58:09] ygrek вышел(а) из комнаты
[15:58:28] ygrek вошёл(а) в комнату
[15:58:29] ygrek вышел(а) из комнаты
[15:58:31] ygrek вошёл(а) в комнату
[16:06:28] <Kakadu> Всё-таки, кто какую структуру данных порекомендует для второй задачи из http://msimuni.wikidot.com/fp-dop4 ?
[16:12:00] <Kakadu> Ещё бы неплохо просвятиться по попводу type ('a, +'b) t
[16:12:06] <Kakadu> что такой +?
[16:20:36] myxomop87 вошёл(а) в комнату
[16:21:18] <Kakadu> Есть варианты использовать Map где ключом будет номинал, а значением - количество резисторов
[16:21:44] <Kakadu> при всём этом надо учитывать, что мне надо извлекать из мапы эффективно ключи
[16:22:27] <Kakadu> есть ещё Hashtable обычная и шустрая, где улучшен replace с помощью дополнительной ссылки
[16:25:12] <Kakadu> вообще если у меня много резисторов, сколько я могу получить различных сопротивлений?
[16:25:47] <Kakadu> положим изначально n. На первом шаге можно получить максимум C(n,2) i.e. n(n-1)/2
[16:26:15] <Kakadu> затем (n-1)(n-2)/2...
[16:29:17] <Kakadu> т.е. n+1/2 * sum( (n-i)*(n-i-1), i=0.. (n-2) )
[16:34:11] <Kakadu> а эта большая сумма является
[16:34:47] <Kakadu> sum ( (i+1)!! / i!!) где i = 1.. (n-1)
[16:53:40] <Kakadu> Хотя я сильно вру
[16:55:14] <gds> +'b -- протаскивание подтипизации (ковариантный типовой параметр).
[16:59:24] Typhon вышел(а) из комнаты
[16:59:52] <gds> а про сопротивления -- я бы чесал репку над тем, что все исходные и конечные (но не обязательно промежуточные) числа -- целые.
[17:12:50] <myxomop87> непонятно с этим джаббер.ру, каждый раз надо вводить капчу чтобы зайти в рум ? :-o
[17:13:16] <myxomop87> после перла бросается в глаза недостаток документации, это просто жесть как ее мало
[17:13:27] <myxomop87> наверно поэтому кэмл и не популярен
[17:13:47] <gds> а по какому вопросу нужна документация?
[17:13:48] <myxomop87> хотел изучить lwt, но документация просто шляпа
[17:14:30] <myxomop87> взять любой продукт, например ocsigen или lwt, jocaml - документации почти 0
[17:14:38] <Kakadu> Вы просто loxygen для llvm+clang не видели
[17:14:49] <Kakadu> doxygen*
[17:15:05] <gds> http://ocsigen.org/lwt/doc/api/Lwt.html -- и оттуда дальше.  Понятно, что там требуется представлять, что такое монадный ввод-вывод, и для этого есть другие источники, а документация на сам lwt там вполне нормальная.
[17:16:10] <myxomop87> да-да по этой ссылке - минимализм в чистом виде
[17:16:46] <myxomop87> вот пример нормальной доки http://search.cpan.org/~mlehmann/Coro-5.23/Coro/Intro.pod
[17:17:48] <myxomop87> э, в общем я хотел узнать есть ли в окэмл како-нибудь аналог эрланговских процессов ?
[17:20:15] <gds> если представлять монадный ввод-вывод, то минимализма вполне хватает, проверял.  Хотя, конечно, по ссылке на Coro документация полнее.
[17:21:06] <gds> если нужно куча процессов в кооперативных green threads, то -- lwt и поверх него лепить, навверное.  Если эрланговский стиль -- jocaml.
[17:22:33] <Kakadu> gds: а где лучше прочитать про +?
[17:26:25] <Kakadu> я нашел www-staff.it.uts.edu.au/~cbj/Publications/covariant_types.ps.gz , но хочется для ознакомления нечто менее математичное
[17:26:49] <myxomop87> да, к сожалению в монадах не шарю, а lwt будет все ядра\процессоры задействовать ?
[17:28:57] <gds> lwt -- нет.
[17:29:29] <gds> Kakadu: http://brainslugs.blogspot.com/2007/08/blog-post_15.html как вводная, http://newstar.rinet.ru/~goga/tapl/tapl019.html по подзаголовку "Снова ссылки", ну и кое-что сейчас опишу тут.
[17:30:21] <gds> впрочем, на английском информации больше, если что.  Искать по covariance contravariance parametric(?) types ocaml.
[17:30:34] <Kakadu> ясно
[17:33:28] <myxomop87> э, тогда непонятно какой прикол сейчас в этом lwt, сейчас все машины многоядерные
[17:33:46] <gds> прикол -- в green threads.
[17:34:08] <myxomop87> а окэмловский thread разве не грин ?
[17:34:23] <myxomop87> ну и вообще годится для быстрых штук
[17:35:28] <arhibot> myxomop87: бери erlang да и nif да и все :)
[17:36:02] <gds> окамловские -- Thread может быть интерфейсом как к vmthreads, так и к systhreads (или просто threads).  vmthreads -- байткодовые green threads.  systhreads -- на каждую нить рожается системный тред, но два окамловских треда одновременно не выполняются.
[17:37:57] <myxomop87> да уж , все запутано
[17:38:32] <arhibot> gds: т.е. smp не поддерживает?
[17:38:34] <myxomop87> в итоге так и не понятно для чего же lwt, я так понимаю для любителей монад.
[17:38:41] <gds> smp не поддерживает.
[17:38:47] <myxomop87> и главно почитать ничего нет
[17:38:50] <myxomop87> жаль
[17:39:02] <gds> lwt -- green threads, которые выполняются в том числе в нативном коде.
[17:39:39] <gds> lwt -- именно для реализации задач, которые должны быть реализованы так.  Монады -- просто способ работать с нитями.
[17:40:31] <myxomop87> а есть такие треды, чтобы и green и легкие и нативные и мультипроцессорные ?
[17:40:38] <gds> jocaml есть.
[17:41:08] <myxomop87> ясно, хотя непонятно почему надо было форк языка длеать а не устроить их в самом ocaml
[17:41:39] <Kakadu> Интересно как janestreetовцы с многопоточностью имеют дело
[17:41:42] <gds> потому что это не совсем нити, это join calculus, и для него нужна специальная поддержка.
[17:41:47] <myxomop87> ну и дока там еще хуже чем у lwt
[17:42:12] <myxomop87> ок, спасибо за ответы :)
[17:42:27] <myxomop87> немного прояснилось
[17:42:52] <myxomop87> а то я как ежик в тумане окэмала
[17:44:19] <ygrek> > каждый раз надо вводить капчу чтобы зайти в рум
для не-member'ов да
[17:44:31] <myxomop87> вобщем я так понял что нативные systhreads будут медленнее lwt, а vmthreads медленнее systhreads
[17:44:47] <gds> смотря какие задачи.
[17:45:09] <myxomop87> ну веб приложение, много запросов и все такое
[17:46:09] <myxomop87> обработчки сетевых коннектов и еще пул для тяжелых задач бизнес логики
[17:46:12] <ygrek> веб-приложение которому нужно smp, это что-же за зверь такой??
[17:46:34] <arhibot> интерпрайз :)
[17:46:40] <gds> Kakadu: про подтипизацию -- чуть больше, чем влезет в чат, получается у меня.  Пишу в жыжыцу.
[17:46:48] <myxomop87> хм, по-моему веб-приложение которому не нужно smp это зверь ?)
[17:47:17] <myxomop87> зачем же на сервера покупают железки с кучей cpu
[17:48:59] <ygrek> выбрать из базы данных и отформатировать веб-страничку это конечно очень cpu ёмкая задача
[17:49:48] <myxomop87> не только, например есть задача картинки обработать
[17:51:53] <myxomop87> или такая вещь, прилождение делает запрос на n веб сервисов и еще в базу и хочется чтобы клиент ждал минимально, т.е. запустить все эти запросы параллельно
[17:52:06] <ygrek> ну и для этого не нужно n cpu :)
[17:52:10] <myxomop87> хотя оно коненчо и на одном ядре можно
[17:52:27] <myxomop87> для этого lwt лучше всего подойдет ?
[17:52:33] <myxomop87> а для кратинок jocaml
[17:52:37] <myxomop87> выходит так ?
[17:52:43] <ygrek> у jocaml'а кстати дока очень хорошпя
[17:53:01] <ygrek> и многопроцессорность он поддерживает не более чем родной камль
[17:53:24] <ygrek> один процесс на ядро и async io -> win
[17:53:28] <arhibot> а erlang поддерживает :|=
[17:53:46] <ygrek> arhibot: кстати не так давно стал поддерживать
[17:53:58] <arhibot> ygrek: с 12 вроде
[17:54:08] <ygrek> камль для smp тоже есть, только как видится никому особо не нужен
[17:54:16] <gds> ygrek: как так, насчёт многопроцессорности в jocaml?  А запустить кучу копий?
[17:54:19] <myxomop87> значит выходит зря за 12 ядер деньги плачены ? %)
[17:55:11] <myxomop87> конечно мого и в erlang подать, но ocaml мне больше нравится
[17:55:14] <ygrek> gds: "не более чем родной камль"
[17:56:27] ygrek загружает 32 ядра и гигабитный канал
[17:59:01] <ygrek> как любит тыкать jdh - нативные треды нужны для паралельных алгоритмов на большом куске шареных данных - типа перемножения матриц итп - если задача делится на n независимых кусков то message passing спасает
[17:59:43] <ygrek> и всё таки oc4mc есть, надо его тоже щупать
[18:03:36] <arhibot> или clojure
[19:30:25] Typhon вошёл(а) в комнату
[19:31:29] <Typhon> "один процесс на ядро и async io -> win" ++
[19:32:13] <Typhon> недавний mirage, кстате, про это тоже (ocaml поверх xen, который на голом железе)
[19:36:24] <Typhon> jdh == jon harrop ?
[19:43:52] abiogenesis вошёл(а) в комнату
[19:47:10] <ygrek> угу
[19:47:58] <ygrek> ну это классическая модель, а first-class функции облегчают задачу
[19:48:05] abiogenesis вышел(а) из комнаты
[19:52:50] serp256 вошёл(а) в комнату
[19:55:31] <Typhon> ygrek, btw, ты упомянул недавно свой todo-list по книгам. можешь показать, если не секретно :-) (интересуют нехудожественные, если что)
[20:05:10] serp256 вышел(а) из комнаты
[20:05:35] serp256 вошёл(а) в комнату
[20:17:24] serp256 вышел(а) из комнаты
[20:17:47] serp256 вошёл(а) в комнату
[20:22:54] serp256 вышел(а) из комнаты
[20:23:23] serp256 вошёл(а) в комнату
[20:30:29] serp256 вышел(а) из комнаты
[20:31:00] serp256 вошёл(а) в комнату
[20:33:40] abiogenesis вошёл(а) в комнату
[20:34:38] ermine вошёл(а) в комнату
[20:35:40] serp256 вышел(а) из комнаты
[20:36:11] serp256 вошёл(а) в комнату
[20:37:50] <ygrek> Typhon:
Elements of Programming
THE ART OF MULTIPROCESSOR PROGRAMMING
The Computational Beauty of Nature
"Functional Approach to Programming", Cousineau & Mauny
Стивенс - "Протоколы TCP/IP. Практическое руководство"
Корман. "Алгоритмы. Построение и анализ".
PTAPG
Garbage Collection: Algorithms for Automatic Dynamic Memory Management
Concepts, Techniques, and Models of Computer Programming
[20:45:19] serp256 вышел(а) из комнаты
[20:45:59] serp256 вошёл(а) в комнату
[20:48:15] <arhibot> ygrek: спасибо за наводку на THE ART OF MULTIPROCESSOR PROGRAMMING--вроде интересная вещь
[20:50:37] zert вошёл(а) в комнату
[20:51:43] <ygrek> у меня этот список наверное уже года два без изменений :-/
[20:56:15] serp256 вышел(а) из комнаты
[20:56:45] serp256 вошёл(а) в комнату
[21:01:27] Typhon вышел(а) из комнаты
[21:03:34] serp256 вышел(а) из комнаты
[21:03:58] serp256 вошёл(а) в комнату
[21:09:52] Kakadu вышел(а) из комнаты
[21:09:59] abiogenesis вышел(а) из комнаты
[21:12:34] serp256 вышел(а) из комнаты
[21:12:49] serp256 вошёл(а) в комнату
[21:17:44] serp256 вышел(а) из комнаты
[21:38:17] SerP вошёл(а) в комнату
[21:38:36] SerP вышел(а) из комнаты
[21:46:07] <gds> обещанное про подтипизацию: http://gds.livejournal.com/54767.html
реально, давно уже хотел написать.
[21:47:55] ygrek вышел(а) из комнаты
[21:48:03] ygrek вошёл(а) в комнату
[22:24:59] <komar> gds: малаца хорошо написал
[22:28:30] <komar> Только <b> поправь.
[22:44:44] serp256 вошёл(а) в комнату
[22:51:27] sceptik вошёл(а) в комнату
[22:51:34] sceptik вышел(а) из комнаты
[22:57:12] <serp256> gds - очень доступное объяснение про варинтность. полезная статейка. При изучении окамла именно эта часть системы типов для меня дольше всего была темным лесом, насколько я помню
года 2-3 назад именно ты мне здесь ее освятил :-)
[23:11:51] ermine вышел(а) из комнаты
[23:30:54] myxomop87 вышел(а) из комнаты
[23:32:05] ygrek вышел(а) из комнаты
[23:50:40] <gds> komar: что именно поправить в "b"?  заменить на "strong"?
[23:50:53] <komar> Уже ничего.\
[23:53:57] Typhon вошёл(а) в комнату
[23:54:33] <gds> serp256: вот так всегда!  напишешь статью с очевидностями, а вдруг внезапно оказывается, что эти очевидности уже очевидны.  Впрочем, может кому-нибудь общая идея будет полезна, на то и расчёт.  Именно на то, плюс какие-то связи с интуицией хотелось нарисовать.
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!