Home
Objective Caml
ocaml@conference.jabber.ru
Четверг, 24 сентября 2009< ^ >
f[x] установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Верблюды грязи не боятся! | release crap
Конфигурация комнаты

GMT+4
[00:13:10] sceptic вышел(а) из комнаты
[00:14:00] sceptic вошёл(а) в комнату
[00:14:07] animist вышел(а) из комнаты: Replaced by new connection
[00:15:07] animist вошёл(а) в комнату
[00:28:19] ygrek вышел(а) из комнаты
[00:57:29] sevenov вышел(а) из комнаты
[01:10:30] sevenov вошёл(а) в комнату
[01:10:58] Typhon вышел(а) из комнаты
[05:13:02] john вошёл(а) в комнату
[06:59:48] john вышел(а) из комнаты
[07:01:37] john вошёл(а) в комнату
[08:07:57] gds вышел(а) из комнаты
[08:44:05] sevenov вышел(а) из комнаты: Replaced by new connection
[08:44:06] sevenov вошёл(а) в комнату
[08:51:21] sceptic вышел(а) из комнаты
[09:02:14] gds вошёл(а) в комнату
[09:20:58] sevenov вышел(а) из комнаты: Replaced by new connection
[09:25:41] sevenov вошёл(а) в комнату
[09:38:19] sevenov вышел(а) из комнаты
[09:39:20] sevenov вошёл(а) в комнату
[09:43:47] ygrek вошёл(а) в комнату
[09:45:48] sevenov вышел(а) из комнаты
[09:48:05] sevenov вошёл(а) в комнату
[10:36:14] <gds> есть у меня чистое нетипизированное лямбда-исчисление. Хочется добавить переменное количество аргументов (для моей частной задачи удобства будут неизмеримо больше гемора при реализации). Делать как в lisp/scheme (явный apply) -- не хочу, а вот карринг -- очень даже хочу. Остальные варианты -- вполне приемлемы, даже если кривоваты. И только сегодня допёр -- а может сделать так, как в окамле с format-аргументами? Ясное дело, что они в лямбду не вписываются никак. Поэтому интересно -- может расскажете, если кто ковырял, как тайпчекер работает с форматными строками?
[10:42:10] Typhon вошёл(а) в комнату
[10:50:07] john вышел(а) из комнаты
[10:55:53] f[x] вошёл(а) в комнату
[11:08:20] sevenov вышел(а) из комнаты
[11:08:43] sevenov вошёл(а) в комнату
[11:17:48] f[x] вилами по воде
а форматные функции ведь и не с переменным числом аргументов. При заданном fmt - фиксированный тип. А при не заданном - возвращается функция (тип которой зависит от fmt, параметр 'a):
# let f fmt = Printf.printf fmt;;
val f : ('a, out_channel, unit) format -> 'a = <fun>
# let g fmt = f ("%u" ^^ fmt);;
val g : ('a, out_channel, unit, unit, unit, unit) format6 -> int -> 'a =
<fun>

[11:19:03] <f[x]> т.е. со стороны тайпчекера магия только в том что строка превращается в тип в compile-time (а по хорошему это мог бы camlp4 делать наверное)
[11:24:36] <animist> со стороны тайпчекера можно делать функции (внешне выглядящие как) с переменным числом аргументов, используя рекурсивные типы аргументов
[11:25:26] <animist> type a = unit -> a;;
let rec f _ = print_endline "Hello"; f
let _ = f 1 2 3 4 5
[11:37:40] <f[x]> -rectypes нужен
[11:38:27] <f[x]> вообще не совсем понятно что значит - "с переменным кол-вом аргументов" - где-то это переменное кол-во задаётся ведь.
[11:39:21] <f[x]> т.е. либо в форматной строке, либо ещё как-то
[11:39:54] <f[x]> вот это вот ещё как-то может быть функций на манер комбинаторов
[11:45:14] <gds> ага, понял отличия моего случая от форматных строк. В форматных строках количество аргументов чётко задано, и функция, вызываемая с форматной строкой, может вернуть только значение типа, определённого этой строкой (например, для (sprintf "%b %i" true) тип будет int -> string). Поэтому и лямбда-абстракция, и карринг работают нормально, и это проверяется типовыводилкой. Типы форматов понял, буду думать дальше.
про unit -> 'a -- забавно, однако мне пока не надо забарывать типовыводилку.
[11:50:35] <f[x]> суть в том чем определяется переменное число аргументов - оно определяется другим аргументом
[12:00:48] <gds> помедитировал. да, верно, ключевой момент -- известное количество аргументов, а не возвращаемый тип. То есть, у меня так не получится.
Есть идеи, как скрестить случай, когда количество неизвестно, с каррингом? (там проблема в том, куда давать очередной аргумент -- либо в список, кушающий любые количества аргументов, либо обрубаем список и даём очередной аргумент в результат вычисления этой функции, который может быть лямбда-абстракцией. оба варианта кривы, каждый по-своему.) Любые идеи пригодятся.
[12:06:28] <f[x]> я не понимаю, приведи гипотетический пример использования
[12:14:18] <f[x]> я клоню к тому что для принимающей стороны (функии с перменными числом аргументов) - число аргументов на самом деле зависит от чего-то (от другого аргумента). В нетипизированном варианте этот определяющий аргумент вычисляется в рантайме (по принципу форматной строки в няшной сишке). Сделать так в камле "официальным" способом думаю нельзя. Но можно закодировать этот определяющий аргумент средствами языка (format, комбинаторы) - тогда в compile-time будет выводится фиксированный тип который можно каррить итп.
[12:15:23] <gds> вот не пример использования, а скорее пример облома. Обозначу классическую лямбда-абстракцию как (\x. E), а абстракцию, кушающую переменное количество аргументов, как (\x*. E) (к x привязывается список остальных аргументов. разумеется, это может быть только последней лямбда-абстракцией в определении функции).
add := (\x. \y. x+y)
f := (\z. \t*. add z)
g := (f 1) == (\t*. add 1)
(g 2) -- куда применять 2? дописать его в список t, вернув (\t*. add 1) (где t уже будет содержать список [2]), либо применять к (add 1), возвращая (\t*. add 1 2) == (\t*. 3) ?
[12:15:32] <f[x]> а если число аргументов ни от чего не зависит, то тот вариант что привёл animist - получается цикл по всем аргументам. каррить естетсвенно нельзя. и вообще тогда проще аргументы сложить в список :)
[12:17:05] sceptic вошёл(а) в комнату
[12:17:40] <f[x]> облом понятен :) и он проистекает именно от того что число аргументов ни от чего не зависит. вопрос в том - зачем такое надо?
[12:17:43] <gds> про кодирование в окамле -- понял. Если бы там было нужно, использовал бы комбинаторы или списки. Но мне для случая, где лишние скобочки для складывания в список являются скорее злом, которое надо хотя бы попробовать забороть.
[12:18:40] <gds> зачем -- скрещиваю лямбду и макросы. про подход в схеме знаю, не слишком нравится.
[12:22:25] <f[x]> результат получится не type-safe очевидно?
[12:23:33] f[x] фиксирует еретические поползновения
[12:26:29] <gds> хехе. какие-то типы точно будут. пока что в рантайме.
но вот общей рекурсии и мутабельности не будет. негоже это, когда документ при открытии "зависает".
[12:27:04] <gds> самый "чистый" вариант -- при применении макроса (с переменным количеством аргументов) сразу закрывать список нафиг. На то он и макрос, чтобы синтаксически работать. Но пока ещё думаю.
[12:36:02] <gds> а типы, если что, прикрутить всегда можно будет -- пока обхожусь без схемовских-лисповых apply, eval, quote, unquote, quasiquote. Собственно, для того, чтобы обойтись без apply, я и заинтересовался другим подходом к переменному количеству аргументов. Подход с "применили макрос -- рубим список" равносилен синтаксическому преобразованию:
(macro arg1 arg2 .. argN) => (macro's-function (arg1 arg2 .. argN)) с передачей одного аргумента, являющегося списком.
[12:37:24] <f[x]> надо найти живого лиспера и поспрашивать какие тут видно проблемы
[12:37:55] <gds> где ж их найдёшь -- поди все повымерли уже... :]
[12:39:47] <Typhon> http://13-49.livejournal.com/ прямо из ленты, далеко не ходя :)
[12:44:47] <gds> да, крутой дядька.
однако сейчас общая цель проекта скорее будет похожа на кашу. Попробую пока сам -- реализовать планируемое не сложно (когда определюсь окончательно с макросами и ещё некоторыми нужными вещами), а там и в деле попробую.
[13:47:14] sevenov вышел(а) из комнаты
[13:48:57] sevenov вошёл(а) в комнату
[15:14:43] animist вышел(а) из комнаты
[15:14:59] animist вошёл(а) в комнату
[16:44:42] sceptic вышел(а) из комнаты: Replaced by new connection
[16:44:46] sceptic вошёл(а) в комнату
[17:03:49] Mon вышел(а) из комнаты
[17:03:57] Mon вошёл(а) в комнату
[17:11:51] ygrek вышел(а) из комнаты
[17:17:36] Mon вышел(а) из комнаты
[17:17:43] Mon вошёл(а) в комнату
[17:30:13] gds вышел(а) из комнаты
[17:56:12] Mon вышел(а) из комнаты
[17:57:00] Mon вошёл(а) в комнату
[18:06:42] gds вошёл(а) в комнату
[18:55:12] Typhon вышел(а) из комнаты
[20:27:03] f[x] вышел(а) из комнаты
[21:32:01] sceptic вышел(а) из комнаты
[21:35:48] sceptic вошёл(а) в комнату
[23:05:20] sevenov вышел(а) из комнаты
[23:20:34] sevenov вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!