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

GMT+3
[00:13:09] ygrek вышел(а) из комнаты
[00:24:13] digital_curse вышел(а) из комнаты
[01:09:39] valexey вышел(а) из комнаты
[01:22:31] ermine вышел(а) из комнаты
[02:56:05] Typhon вышел(а) из комнаты
[03:27:55] valexey вошёл(а) в комнату
[03:28:13] <valexey> пробую на камле практиковать методику построения программы сверьху-вниз, как описано adept'ом в статье "давно не брал я в руки шашек" и нифига не выходит. из отсутствия нормального undefined
[03:28:24] <valexey> let undef _ = failwith "undef";;
# let (aa,bb,cc) = undef;;
Characters 17-22:
  let (aa,bb,cc) = undef;;
                   ^^^^^
This expression has type 'a -> 'b but is here used with type 'c * 'd * 'e
[03:28:40] <valexey> тут ничего придумать нельзя?
[03:35:40] <olegfink> let undef = Obj.magic () ;; let (aa,bb,cc) = undef ;;
[03:36:37] <valexey> # let undef = Obj.magic () ;;
val undef : 'a = <poly>
# let (aa,bb,cc) = undef;;
Segmentation fault
[03:36:44] <olegfink> ну естественно
[03:37:10] <olegfink> топлевел же пытается напечатать биндинги, и ничего хорошего у него не получается
[03:37:27] <valexey> ага. ясно. он же не ленивый. он сразу вычисляет.
[03:37:42] <valexey> но мог бы хоть ругануться :-)
[03:37:59] <valexey> ладно, спасибо. наверно прокатит.
[03:37:59] <olegfink> хм, лучше все-таки так не делать, есть еще случаи, когда оно вычисляется
[03:38:26] <olegfink> совсем хаскельного undefined здесь понятно почему не может быть
[03:40:17] <valexey> из за отсутствия ленивости?
[03:40:39] <valexey> там в доке ещё что-то написано про расширизмы. в частности про lazy
[03:41:02] <olegfink> у lazy тип свой
[03:41:10] <olegfink> Lazy.t
[03:42:09] <olegfink> а больше кроме -> и lazy_t вроде как способов отложить вычисление нет
[03:43:17] <valexey> ну и ладно. хм. а что такое этот самый Obj.magic ?
[03:43:32] <olegfink> unsafeCoerce
[03:43:45] <olegfink> или как там его у вас зовут
[03:44:07] valexey вышел(а) из комнаты
[03:44:12] valexey вошёл(а) в комнату
[03:44:23] <valexey> приведение типов небезопасное?
[03:44:25] <olegfink> тождественная функция с сигнатурой 'a -> 'b
[03:44:32] <valexey> т.е. откуда угодно куда угодно.
[03:44:32] <olegfink> да
[03:44:52] <valexey> т.е. то что в Сях сплошь и рядом :-)
[03:46:25] <olegfink> в отличие от сей, в хаскелях и окамлах оно едва ли используется в обычном коде.
[03:46:57] <valexey> угу.
[04:01:45] valexey вышел(а) из комнаты
[07:25:28] ermine вошёл(а) в комнату
[07:30:01] daapp вошёл(а) в комнату
[09:05:59] gds вошёл(а) в комнату
[09:19:45] <gds> я тоже пробовал с undefined попроектировать, тоже не получалось одним идентификатором (ещё бы -- если есть идентификатор и его вычислили, то он содержит правильное значение, а не чорт знает что).  Остановился на "raise Exit".
Сейчас прикинул макросы, вполне получается:
let (aa,bb,cc) = Undef in Printf.printf "%s %i %b" aa bb cc
>ocamlc -pp "camlp4o Camlp4MacroParser.cmo -DUndef=\"raise Exit\"" und.ml -o und.exe && .\und.exe
Fatal error: exception Pervasives.Exit
или, если не хочется -DUndef, то можно в программе
DEFINE Undef = raise Exit
или ещё лучше raise Undefined какое-нибудь.
[09:31:23] <gds> а вот такой фокус не проходит, так как __LOCATION__ раскрывается в момент использования (а именно, показывает всегда на DEFINE):
exception Undefined of string * string
module Loc =
  struct
    let of_tuple (a,b,c,d,e,f,g,h) =
      Printf.sprintf "loc=(a=%S b=%i c=%i d=%i e=%i f=%i g=%i h=%b)"
        a b c d e f g h
  end
DEFINE Undef = raise (Undefined (__FILE__, __LOCATION__))
let (aa,bb,cc) = Undef in Printf.printf "%s %i %b" aa bb cc
[09:51:12] Typhon вошёл(а) в комнату
[09:59:59] <gds> изначально формулировал в чятик, потом решил не сражать объёмом, запостил в жыжыцу.
http://gds.livejournal.com/49560.html
действительно, интересны комментарии.  Там или тут -- не важно.  (лучше, конечно, там, так как оно более постоянно и структурированно получается.)
[10:00:10] <gds> там про overbld, если чо.
[10:09:09] serp256 вошёл(а) в комнату
[10:09:51] ygrek вошёл(а) в комнату
[10:10:08] <Typhon> gds: что кстати в оверблд с ocamlfind? а то я как-то не заморачивался и ща машина с оверблд далеко.
[10:10:45] <gds> он -- работает!
[10:10:54] <gds> конечно, ставит куда надо, и всё такое.
[10:14:36] <Typhon> я тут на днях 64битную 7 венду поставлю на одну из машин, можно будет погонять оверблд там. по посту, если чо, думаю мылси :)
[10:15:05] <ygrek> Typhon: ты ocamlexc собрал-то?
[10:16:57] <gds> о, про вин7 -- это хорошо.  А я к тому времени попробую собрать бинарные mingw+msys+tcltk+gtk+либы, вдруг получится без такого количества дурной работы, как сейчас.
[10:19:26] <Typhon> ygrek: да, без графической смотрелки от него толку не много, если интересно вывод и тестовую програмку кину. собирается оно немного с бубном, потому что требует tk нещадно
[10:32:04] <Typhon> http://paste.in.ua/469/ как-то так
[10:59:01] iNode вышел(а) из комнаты
[11:14:43] Typhon вышел(а) из комнаты
[11:15:06] Typhon вошёл(а) в комнату
[11:23:11] f[x] вошёл(а) в комнату
[11:23:24] valexey_ вошёл(а) в комнату
[11:26:08] <valexey_> gds , olegfink : для undefined мне придумалась вот такая комбинация:
let undef = failwith "undef" ; Obj.magic();;
[11:26:27] <valexey_> т.о. и при этапе компиляции ошибок нет, и в момент исполнения имеет исключение а не сегфолт.
[11:26:33] <gds> и вычислится она ровно в момент вычисления этого let undef.
[11:26:57] <valexey_> компиляции это не мешает.
[11:27:38] <gds> зато мешает частичному тестированию уже написанного кода.
[11:30:11] <valexey_> это уже сложности второго порядка ;-)
[11:41:53] <gds> решение с макросом не мешает частичному тестированию, если что.
[11:42:42] <valexey_> надо будет попробовать.
[11:43:39] <valexey_> т.е. макрос Undef -- имеет таки любой тип? т.е.
let a = Undef;;
let a::b = Undef;;
let (a;b)::c = Undef;;
[11:43:44] <valexey_> всё будет валидно?
[11:45:10] <gds> по идее да, будет заменён на "raise Чтонадо", что может иметь любой тип.
[11:49:18] ygrek вышел(а) из комнаты
[11:50:27] <valexey_> кстати, а как у камла с юнит-тестами?
[11:51:29] <gds> "oUnit".
[11:52:57] <valexey_> хорошо звучитэ
[12:04:20] <Typhon> valexey_: оно, если что, в батарейках для testsuite используется
[12:05:16] <valexey_> гм. надо будет батарейки пощупать.
[12:23:01] gds вышел(а) из комнаты
[12:26:47] gds вошёл(а) в комнату
[12:40:30] daapp вышел(а) из комнаты
[13:29:35] ygrek вошёл(а) в комнату
[13:33:51] serp256 вышел(а) из комнаты
[13:34:02] serp256 вошёл(а) в комнату
[13:45:56] ygrek вышел(а) из комнаты
[13:46:01] ygrek вошёл(а) в комнату
[14:06:52] <gds> меня травят, просят нарисовать комонаду средствами окамловского ооп.
class virtual ['a] comonad =
  object
    method virtual counit : 'a comonad -> 'a
    method virtual cobind : 'b. ('b comonad -> 'a) -> 'b comonad -> 'a comonad
  end;
Error: This type scheme cannot quantify 'b :
it escapes this scope.
странная штука.  В рассылке о похожем говорили ( http://caml.inria.fr/pub/ml-archives/caml-list/2009/04/2be33ff5fe9581fe97d5e7cf46eb55c2.en.html ), но не понимаю, откуда ограничение.
[14:07:28] <valexey_> хаскелисты взяли твой след?
[14:09:37] <gds> "don't cofear comonads", или как там.
[14:12:52] <valexey_> "Одно из классных свойств ООП в окамле состоит в том, что нет нужды использовать большинство ООП-паттернов."
[14:13:10] <valexey_> одно из классных ООП в окамле состоит в том, что оно не нужно :-)
[14:13:47] <serp256> Без наследования очень тяжело жить иногда :-)
[14:14:16] <valexey_> особенно если ООП головного мозга :-)
[14:14:33] <gds> ООП иногда нужно.  Понятно, всегда можно и без него.
[14:15:02] <serp256> Обойтись то можно кто спорит. Но тут вопрос цены и надобности.
[14:15:29] <gds> именно.
[14:15:57] <valexey_> в общем, сколь я понял, вначале нужно смотреть общеMLьные-функциональные вещи, потом подули, а уже потом, если приспичит, ООП.
[14:16:28] <serp256> Когда предметная область требует его... Вот последний проджект решил ООП не юзать из принципа "типа в окамле без него можно". Ну и пипец аццкое нагромождение функторов с целью обеспечить подобие наследования
[14:17:16] <valexey_> это что за предметная область такая?
[14:17:18] <serp256> Жить со структурами, в которых поля назвать одинаково нельзя меня и так всегда напрягало :-)
[14:17:26] <serp256> Ну игры
[14:17:50] <valexey_> это да. с рекордами у камла жопа.
[14:17:59] <serp256> Модель игры - это модель мира, которая очень хорошо ложица в ООП
[14:20:26] <gds> с рекордами у камла всё нормально.  Не нравятся рекорды -- есть другая штука, подобная им, но с угловыми скобками вместо фигурных.  Там и названия полей могут совпадать, и ещё много чего хорошего есть.
[14:20:28] <valexey_> хреново оно ложится. ну, по кр. мере некоторые. у мну хобби -- одна pbem стратежка. собственно написано оно до меня, но я периодически ковыряю на тему создания новых клиентов, или серверов. так вот -- пока пытался применять ООП подход, были постоянные проблемы. Ну никак. Тут сложится хорошо, там косяк архитектурный вылезет. Сейчас вот немного (с полгода как) увлёкся ФП. Посему под другим углом взглянул на декомпозицию задачи. И всё получилось.
[14:20:58] <valexey_> gds: это что за угловые скобки? пару раз видел, пару раз пугался :-)
[14:21:20] <gds> это такие особые клёвые записи, попробуй :]
[14:21:50] <valexey_> пушер! пытаешься подсадить на угловые скобки?!
[14:21:52] <valexey_> ;-)
[14:22:08] Typhon знает умное слово row types
[14:24:59] <gds> да, row types, объекты, это пишется в угловых скобках.
type vec2d = < x : float ; y : float >;
type vec3d = <  x : float ; y : float ; z : float >;
и вперёд :)
[14:25:13] gds прикидывает: не может же быть так, чтобы не нравились и записи, и объекты одновременно..
[14:26:09] <valexey_> а чем оно отличается от туплов/записей?
[14:26:11] <valexey_> технически.
[14:26:17] <valexey_> паттернматчингом?
[14:28:25] <valexey_> хех. f# мну послал.
[14:29:07] <gds> с точки зрения типизации -- тем, что "объектом типизации" является не номинальный тип (запись, идентифицируемая названием одного из полей), а структурный тип -- множество полей с их типами.
[14:31:19] <valexey_> т.е. type vec2d = < x : float ; y : float >; и type complex = < x : float ; y : float >; -- будет один и тот же тип?
[14:31:26] <valexey_> конфликт будет или как?
[14:32:21] <gds> не будет конфликта, вроде.
[14:32:47] <valexey_> типы будут разные или это будет один и тот же тип с алиасом?
[14:34:37] <gds> последнее.
[14:34:56] <valexey_> ага. значит таки протекает.
[14:35:14] <gds> у меня не протекает.
[14:35:16] <valexey_> эдакий статический duck typing ;-)
[14:35:27] <gds> да, оно и есть.
[14:36:27] <valexey_> не хорошо.
[14:38:26] <gds> for whom how
[14:45:53] <valexey_> type ttype1 = A | B | C;;
type ttype2 = A | B | C;;
[14:45:59] <valexey_> и ошибок нет :-\
[14:46:13] <valexey_> зато A теперь у нас всегда только ttype2
[14:46:45] <gds> это называется "область видимости".
[14:47:13] <valexey_> это называется -- не проверка компилятором на конфликт имен.
[14:47:21] <valexey_> что плохо.
[14:48:23] <valexey_> это всё равно что в сях можно было бы:
int a;
double a;
int a;
[14:48:35] <valexey_> написать в одном блоке. и всё было бы хорошо. без ошибок :-)
[14:48:37] <gds> не обязательно плохо.  Если есть два валидных куска кодэ, я могу их слепить в один в любом порядке, и всё будет работать как работало.
[14:51:12] <gds> обычно тот, кто определяет типы, знает, что делает.  Если же переопределить конструкторы, это будет либо так же корректно (например, в случаях идентичных определений), либо ошибка быстро вылезет (конфликт типов или неполный паттерн матчинг).
[14:52:56] <valexey_> ну да, ну да.
int a;
int a; // тоже всё хорошо.
[14:53:04] <valexey_> так же корректно как и один раз int a
[15:09:21] iNode вошёл(а) в комнату
[15:22:23] sceptic вышел(а) из комнаты
[15:50:27] valexey_ вышел(а) из комнаты
[15:56:27] valexey_ вошёл(а) в комнату
[17:30:05] gds вышел(а) из комнаты
[17:39:09] Kakadu вошёл(а) в комнату
[18:08:14] Kakadu вышел(а) из комнаты: Replaced by new connection
[18:08:16] Kakadu вошёл(а) в комнату
[19:06:39] serp256 вышел(а) из комнаты
[19:15:42] f[x] вышел(а) из комнаты
[19:23:11] Typhon вышел(а) из комнаты
[19:30:52] Typhon вошёл(а) в комнату
[19:31:11] Typhon вышел(а) из комнаты
[19:40:35] valexey_ вышел(а) из комнаты
[20:10:22] Kakadu вышел(а) из комнаты
[20:56:56] Typhon вошёл(а) в комнату
[21:15:59] Kakadu вошёл(а) в комнату
[21:16:10] Kakadu вышел(а) из комнаты
[21:21:07] digital_curse вошёл(а) в комнату
[21:28:23] Kakadu вошёл(а) в комнату
[21:28:35] Kakadu вышел(а) из комнаты
[21:32:48] gds вошёл(а) в комнату
[21:35:44] <ygrek> Typhon: интересно, я думал что оно новым камлем не собирается. надо будет попробовать на реальном коде потестить
[21:36:44] <Typhon> придется только все библиотеки, которые используются прогонять через ocamlexcc (стдлиб при установки прогоняется)
[21:37:56] <Typhon> интересно какие при этом глюки повылызят)
[21:51:25] Typhon вышел(а) из комнаты
[21:53:08] ygrek вышел(а) из комнаты
[23:39:33] Typhon вошёл(а) в комнату
[23:39:50] Typhon вышел(а) из комнаты
[23:58:59] ermine вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!