Home
Objective Caml
ocaml@conference.jabber.ru
Понедельник, 15 августа 2011< ^ >
f[x] установил(а) тему: Камль -- http://caml.inria.fr | http://camlunity.ru/ (теперь с git доступом!) | Верблюды грязи не боятся! | release crap, enjoy NIH | репортьте баги официальным дилерам | ocaml мёртв и тормозит, move on | stdlib only? - ССЗБ
Конфигурация комнаты
Участники комнаты

GMT+4
[00:00:42] <Kakadu> ermine: { a; b; c }
[00:00:54] <ygrek> и let open
[00:01:30] <ermine> опен еще на модуль заменить можно
[00:01:46] <ermine> да и рекорд тоже
[00:01:48] <Kakadu> я все вот пытался осмыслить зачем нужeн sexplib.... так и не понял
[00:02:30] <ermine> макросами генерить левый функционал
[00:02:42] <ermine> но я на него даже и не смотрела
[00:03:51] <ermine> Kakadu: а что в графах делаешь?
[00:05:10] <ermine> ой, оно хочет js core
[00:05:14] <Kakadu> беру классы
[00:06:04] <Kakadu> с согласно наследованию делаю что-то типа дерева с несколькими корнями
[00:06:32] <Kakadu> у классов известны нормальные методы и pure виртуальные
[00:07:08] <Kakadu> чтобы понять, что класс абстрактный, надо осыпать виртуальные методы вниз по "дереву"
[00:07:25] <Kakadu> ну значит абстрактные классы надо генерить по-особому
[00:07:43] <Kakadu> в кратце это всё
[00:09:22] <ygrek> аргх, tyxml требует 3.12 всё равно
[00:09:48] <ygrek> Kakadu: вообщем собери с ocamlopt пока и покажи трейс
[00:09:59] <ygrek> пока я тут в 3.12 все зависимости поставлю
[00:10:47] ermine уже на 3.12.1
[00:12:27] <ermine> поставить чтоль core
[00:13:47] <ermine> а, сначала сексуальную либлу поставить надо
[00:15:13] <ermine> блин, разброд в версиях с type-conv
[00:15:57] <Kakadu> всё, ничего не компилируется. кошмар
[00:18:47] <ygrek> ну cma поубирай
[00:18:57] <Kakadu> аааа
[00:19:20] <Kakadu> я сидел, тупил, оказалось, что  в `ocamlc` были русские буквы
[00:20:41] <ermine> оазис
[00:20:44] arhibot вышел(а) из комнаты
[00:21:41] <Kakadu> ура, я сделал что надо
[00:21:52] <Kakadu> теперь везде ocamlopt и cmxa
[00:22:36] <Kakadu> судя по тому, что бэктрейс не поменялся - я что-то сделал неверно
[00:23:09] <Kakadu> ммм ? http://paste.org.ru/?3wjmv3
[00:23:30] <ermine> -g
[00:23:41] <ermine> а, стоит
[00:23:50] <ygrek> ./main.opt
[00:24:03] <Kakadu> ygrek: одна фигня
[00:24:16] <Kakadu> тот же бектрейс
[00:24:18] <ygrek> не може буть
[00:25:14] <Kakadu> я пока попробую собрать байт-код
[00:26:49] <ermine> Kakadu:  у тебя в бэктрейсе явная ссылка на интерпретатор камла
[00:27:18] <Kakadu> ermine: и это значит....
[00:27:36] <Kakadu> что у меня не полностью натив?
[00:28:11] <ermine> а ты покажи бэктрейс
[00:28:18] <ermine> новый
[00:28:24] <Kakadu> #0  0x000000000042e7da in caml_ml_string_length ()
#1  0x000000000043a08c in caml_interprete ()
#2  0x0000000000428470 in caml_startup_code ()
#3  0x0000000000414110 in main ()
[00:28:52] <ermine> ну вторая строчка - байткод
[00:29:20] <ermine> сделай маке клеан
[00:29:24] <Kakadu> делал
[00:29:43] <ygrek> аргх, core нет в testing'е
[00:30:00] <Kakadu> ygrek: я в шоке сам. Он там был в июне
[00:30:09] <ermine> ygrek: там оазис вроде уже
[00:30:12] <ermine> в коре
[00:31:23] <ermine> но у меня sexplib не собирается из-за type-conv c выкинутым Gen.idx
[00:31:44] <ermine> надо проверить, не вернули ли взад в 3.0.1
[00:32:20] <Kakadu> сейчас убью пакеты и соберу руками, ибо incorrect assumptions проскакивают
[00:33:34] <ermine> не вернули
[00:33:37] <ermine> гадыыы
[00:33:57] <Kakadu> а какой у тебя type-conv?
[00:34:24] <ermine> 3.0.0 сейчас
[00:34:46] <ermine> надо ставить 2.1.0 или какой он там
[00:34:51] <Kakadu> 2.3
[00:35:28] <ermine> ну и бох с ним
[00:39:36] shaggie вошёл(а) в комнату
[00:52:01] <Kakadu> надо будет разобраться что писать вместо
-pp "camlp4o -I `ocamlfind query sexplib` -I `ocamlfind query type-conv` pa_type_conv.cma pa_sexp_conv.cmo"
[00:53:52] <Typhon> надо оазис осилить ^_^ правда синтакс в _tags дописывать пока придётся
[00:54:49] <Kakadu> Error: Files /usr/local/lib/ocaml/3.12.0/core/core.cma(Core)
       and /usr/lib/ocaml/vmthreads/threads.cma(Thread)
       make inconsistent assumptions over interface Thread
[00:55:15] <Kakadu> учтя, что чтобы это победить я пересобирал core, я немного в тупике.
[00:56:18] <ygrek> пути намешал
[00:56:20] <ygrek> ?
[00:56:26] <ygrek> в /usr/bin какой камль?
[00:56:54] <Kakadu> $ /usr/bin/ocamlc -version
3.12.0
[00:57:10] <ygrek> тогда странно :)
[01:00:29] <ygrek> >Flag linux
>  Description: Enable linux specific extensions
>  Default$:    system(linux)
[01:00:44] <ygrek> $ grep system setup.data
system = "linux_elf"
[01:00:53] <ygrek> молодцы
[01:01:10] <Kakadu> ?
[01:01:29] <ygrek> авторы core
[01:02:27] <Kakadu> всёравно не понял
[01:03:32] <ygrek> авторы core - молодцы
[01:03:38] <ygrek> с табличкой "сарказм"
[01:06:07] <Kakadu> а почему?
[01:06:50] <ygrek> потому что на linux/x86 не собирается
[01:07:21] <ygrek> где у них багтрекер кстати непонятно
[01:10:37] <ygrek> сколько у них же кода в core - собирается долго
[01:11:04] <Kakadu> ygrek: ты кути не компилял на селероне 1.8 просто
[01:11:32] <ygrek> я llvm компилял на celeron'е!
[01:12:15] <ygrek> там бинарники с дебажной инфой по 500М получались в результате o_O
[01:12:16] <Kakadu> ухты, похоже что в новом коре есть деревья Адельсона-Вельского
[01:12:23] <Kakadu> ygrek: суров
[01:12:38] <ygrek> это ты так avl tree обозвал что-ли?
[01:12:43] <Kakadu> угу
[01:12:57] <Kakadu> в принципе это всё что я знаю об avl деревьях
[01:13:47] <ygrek> :)
[01:13:48] <Kakadu> интересно, куда они спрятали Core_list.fast_sort
[01:14:47] <ygrek> > File "ghost-location", line 22, characters 24--490:
> Error: Unbound value string_of_sexp
[01:14:50] <ygrek> wtf
[01:15:20] <Kakadu> ygrek: open Sexplib.Conv
[01:16:41] <ygrek> так это в твоём коде то!
[01:16:52] <ygrek> как оно у тебя собирается?
[01:17:03] <ermine> всё еще трахаетесь?
[01:17:07] <Kakadu> у меня было старое коре
[01:17:26] <Kakadu> я теперь новое переставил и развлекаюсь
[01:17:42] <Kakadu> ygrek: можешь подождать до завтра пока я сделаю рабочим это
[01:18:05] <ygrek> List.iter2
[01:18:16] <ygrek> пушнешь и напомнишь завтра
[01:18:43] <Kakadu> iter2_exn
[01:18:51] <Kakadu> напомню
[01:19:53] <Kakadu> самое инетерсное - куда они дели fast_sort
[01:20:01] shaggie вышел(а) из комнаты
[01:21:07] <Kakadu> changelog бы на это core почитать...
[01:24:37] <ygrek> Kakadu: дифф на Makefile - http://paste.in.ua/2909/
[01:27:19] ermine вышел(а) из комнаты
[01:31:38] <ygrek> Error: Error while linking parser.cmo:
Reference to undefined global `Sexplib'
[01:31:39] <ygrek> хм
[01:32:47] <Kakadu> core должна тянуть sexplib
[01:33:47] <Kakadu> ygrek: смержил твои изменения....
[01:33:49] <Kakadu> кхм...
[01:33:54] <ygrek> -linkpkg надо делать в последней линковке!
[01:34:11] <ygrek> ненавижу кривые рукописные makefile'ы!
[01:35:15] <Kakadu> во, уже лучше
[01:39:15] <ygrek> собрал
[01:39:21] <Kakadu> а я нет)
[01:39:54] <ygrek> xml.backup давай
[01:41:16] <Kakadu> я выложил aaa.xml
[01:41:20] <ygrek> http://paste.in.ua/2910/
[01:41:23] <Kakadu> запускать ./main -xml
[01:42:02] <Kakadu> дифф верный
[01:42:46] <ygrek> полные пути в коде - убивать
[01:42:52] <Kakadu> я знаю
[01:43:21] <ygrek> ок
[01:44:29] <ygrek> долго работает
[01:45:08] <Kakadu> парсинг долгий, поэтому бэкап появился
[01:45:30] <ygrek> ./main
[01:45:33] <ygrek> не крэшится
[01:45:53] <Kakadu> а файл ./out/classes.ml у тебя большой?
[01:45:56] <ygrek> куча skipping
[01:46:07] <ygrek> 47 байт :)
[01:46:20] <ygrek> это надо qt хидеры поставить что-ли?
[01:46:32] <Kakadu> нет, ничего не надо
[01:46:48] <Kakadu> файл xml - это апи генерированное qtjambi
[01:47:01] <ygrek> $ wc -l out/*
29 out/Makefile
  4 out/classes.ml
  3 out/creators.ml
  2 out/stubs.ml
[01:48:08] <ygrek> $ stat -c %s xml.backup
6011697
[01:48:21] <ygrek> и чего это значит?
[01:49:16] <Kakadu> размер правильный
[01:50:15] <ygrek> может ещё чего-нибудь захардкожено в коде?
[01:51:03] <Kakadu> просто после внедрения изменений с новым коре у меня тоже начал маленький файл на выходе появляться
[01:51:53] <ygrek> гг
[01:52:03] <ygrek> мило
[01:52:32] <Kakadu> думаю, что разумно пойти спать, ибо пора применять интеллект
[01:52:52] <Kakadu> по крайнему мне, чтобы разобраться в этом
[01:53:48] <ygrek> разумно
[01:53:49] ygrek off
[01:53:52] <Kakadu> Эн таро Адун!
[01:53:55] Kakadu вышел(а) из комнаты
[01:54:00] <ygrek> завтра пнёшь если что будет
[01:56:34] ygrek вышел(а) из комнаты
[03:36:25] digimmortal вошёл(а) в комнату
[03:52:52] Typhon вышел(а) из комнаты
[03:57:45] digimmortal вышел(а) из комнаты: Replaced by new connection
[03:57:45] digimmortal вошёл(а) в комнату
[04:42:32] digimmortal вышел(а) из комнаты
[07:23:27] mrm вошёл(а) в комнату
[09:04:06] Kakadu вошёл(а) в комнату
[09:27:51] <Kakadu> собственно моя программа пофейлилась потому что там был код
let isTemplateClass name =
    try ignore (String.index name '<'); true
    with Not_found -> false
[09:28:22] <Kakadu> а в новом коре сигнатура у String.index стала :string -> char -> int option
[09:28:39] <Kakadu> и надо было использовать метод find_exn
[09:28:59] <Kakadu> интересно, как надо писать код, чтобы такие вещи отлавливались при компиляции
[09:29:29] <Kakadu> s/find_exn/index_exn/
[10:19:28] <f[x]> Kakadu: ignore (String.index name '<' : int)
[10:19:39] <f[x]> ignore и let _ лучше всегда типировать
[10:20:15] <Kakadu> f[x]: спасибо. я тоже думал о чем-то подобном
[10:22:01] <f[x]> > не осознал, зачем млдонкей при старте пытается куда-то запросы слать (два адреса, 1 tcp, 1 udp). я же ещё никаких торрентов не добавлял.
проверяет dns резолвится или нет, и качает базу geoip и ещё какие-то блоклисты, всё отключается в настройках
[10:22:06] <f[x]> Typhon ^^
[10:38:55] <Kakadu> а у кого-нибудь есть топлевел, где можн как-то прыгать курсором через слово?
[10:39:20] <Kakadu> в баше С-лево не работает
[10:43:48] <f[x]> rlwrap
[10:49:38] <Kakadu> во
[10:49:42] <Kakadu> ledit sucks
[11:02:45] ermine вошёл(а) в комнату
[11:08:28] Typhon вошёл(а) в комнату
[11:08:59] bobry- вошёл(а) в комнату
[11:49:31] <bobry-> http://zheng.li/buzzlogs-ocaml/2011/05/18/irc
[11:49:55] <bobry-> "ocamlfind: When using -syntax, the META variable 'preprocessor' must be set" значит что нету какого то пакета, ох йома
[11:50:00] <bobry-> в FAQ чтоли добавиьт
[11:50:47] <f[x]> значит что включили препроцессор (-syntax) но не указалди ни одного пакета который бы включал синтаксическое расширение
[11:53:56] <bobry-> ага
[12:23:03] <Kakadu> я долбоеб
[12:23:18] <Kakadu> нахрена я топологическую сортировку изобретал - не знаю
[12:49:57] komar вышел(а) из комнаты: Replaced by new connection
[12:49:57] komar вошёл(а) в комнату
[13:06:48] <bobry-> шота я не соображу, почему у меня Lwt_unix.getprotobyname "icmp" >>= fun _ -> Lwt_io.print "got it";; в состоянии Sleep
[13:34:26] shaggie вошёл(а) в комнату
[14:48:54] zinid вошёл(а) в комнату
[15:53:18] digimmortal вошёл(а) в комнату
[15:53:22] digimmortal вышел(а) из комнаты
[15:53:38] digimmortal вошёл(а) в комнату
[17:13:08] shaggie вышел(а) из комнаты
[17:43:54] ermine неожиданно играет в такую конструкцию:
let abc = fun a when a > 2 -> true;;
try abc 1 with _ -> false

[17:44:09] <ermine> прикольно
[17:49:38] <bobry-> товарищи, а как потоки дебажить?
[17:49:46] <bobry-> у меня поднимается Stream.Error ("")
[17:49:52] <bobry-> но это как то не очень информативно
[17:51:27] <ermine> добавляй принтфы
[17:51:48] <ermine> в каждую ветку "здесь был вася" или "здесь была маша"
[17:51:58] <ermine> и печать текущего элемента
[17:52:10] <zinid> здесь был ermine
[17:52:17] <bobry-> не кошерно как то
[17:53:15] <ermine> bobry-: бросай камло, переходи на Java
[17:53:23] <bobry-> ermine: почему не на х-л?
[17:53:27] <ermine> там всё красиво и кошерно из коробки
[17:53:51] <ermine> ну хаскиль ты точно с таким подходом тоже не освоишь
[17:54:00] <bobry-> с каким таким?
[17:54:09] <ermine> с монадой Error или тайпклассом для логгирования
[17:56:02] <bobry-> не ну это же логично, что парсер знает где он обломился
[17:56:40] <f[x]> загляни в stream после ошибки и будет понятно где остановился
[17:56:53] <ermine> просто ты доку по Stream наверное не дочитал, там написано в каких случаях бросается экспшн Error, а когда Failure
[17:57:29] bobry- виноват <_<
[17:57:32] <bobry-> теперь дочитал
[18:07:23] komar вышел(а) из комнаты: Replaced by new connection
[18:07:23] komar вошёл(а) в комнату
[18:20:04] zinid вышел(а) из комнаты
[18:21:34] mrm вышел(а) из комнаты
[18:39:36] <gds> предлагаю мини-срачик "модули (в том числе первоклассные) vs объекты (которые кошерные, окамловские)".
Конкретно сейчас -- иду погулять (заодно чтобы решить кое-что для себя по этому вопросу), а попозже (через часик, видимо) выдам кое-какие свои соображения (если Вас явно не будет через час, сообщите хоть какое-нибудь своё мнение).  Право дело, обе штуки уже вкусни сочни пяни, но должна остаться только одна.  На повестке дня, в том числе, вопрос "что лучше для реализации/предоставления интерфейса к типу данных".
[18:43:04] <ermine> bobry-: а как для объектов описать требуемый интерфейс get : 'a t -> 'a и успешно применить get str = str.[0]?
[18:43:13] <ermine> для модулей вот не получается
[18:43:38] shaggie вошёл(а) в комнату
[18:44:36] <gds> куда именно применять?  опиши use case подробнее, куда именно суёшь таковой get.
[18:46:09] <ermine> gds: ну module type ведь используются для описания интерфейса модулей, которых применяют в других модулях, нет?
[18:47:10] ermine пока не будет признаваться что за прожектик пытается забацать
[18:47:43] bobry- вообще пока объекты не трогал
[18:47:46] <bobry-> модулей хватает за глаза
[18:47:54] <bobry-> оффтоп: гугл сволочь режет ICMP ответы :(
[18:48:06] <bobry-> искал час багу в своем коде, думал может пропускаю чего
[18:48:13] <bobry-> а оказалось что это все великий и ужасный ...
[18:50:45] ermine тоже скоро пойдет погулять на велике, но постарается не думать про камло
[18:56:57] <gds> ermine: беру твой пример, имею ошибку:
# module S = (struct type char t = string;; val get s = s.[0];; end : A);;
Error: Syntax error
(подчёркнуто "t").  не знаю вот.
[18:58:33] <ermine> gds: да не нужен char t, достаточно type 'a t = string
[18:59:02] <ermine> gds: module type S = sig type 'a t val get 'a t = 'a end
[18:59:04] <gds> но тогда окажется, что get не удовлетворяет сигнатуре 'a t -> 'a.
[18:59:38] <ermine> и описать структы для 'a t = 'a list или 'a array или string
[19:01:27] <gds> конкретный модуль, даже если пропишешь type 'a t = string, не будет удовлетворять сигнатуре sig type 'a t;; val get : 'a t -> 'a;; end.  Потому что у конкретного модуля будет не 'a t -> 'a, а вполне конкретное string -> char.
[19:03:02] <ermine> gds: ну да, поэтому вставал вопрос как снизить полиморфность сигнатуры
[19:04:06] <ermine> gds: оно работает если вынести 'a в отдельный type elt, но тогда у меня появляются другие проблемы из-за кучи параметров
[19:05:23] <ermine> например мне надо type 'a z = A of 'a S.t | ..
[19:06:44] <ermine> захочется писать A of (S with type elt = 'a) .t, а чо, такое можно уже?
[19:09:41] <ermine> в этом плане Java побеждает
[19:12:45] <f[x]> ermine: а (type elt) тебя не сспасает?
[19:14:52] <ermine> f[x]: куда его? в get?
[19:16:23] <ermine> оно в функции вроде абстрагирует только
[19:16:56] Typhon вышел(а) из комнаты
[19:26:32] <f[x]> ну ты сможешь в функции применять функтор и получать модуль параметризированный
[19:26:34] <f[x]> наверное
[19:29:48] <ermine> ну это вариант, который тоже влечет к дальнейшим проблемам - снижении полиморфности в одном месте :))
[19:30:06] <ermine> в общем пока отложила прожект на подсознательно обдумывание дизайна модулей
[19:56:22] <gds> ermine: а если сделать типы 'a elt и 'a coll, и функции типа get : 'a elt -> 'a coll?
> например мне надо type 'a z = A of 'a S.t | ..
не понял, где именно надо.
[20:01:37] <gds> ermine: учитывай ещё вот что: в камле магии нет, и зависимых типов, фактически, тоже нет.  То есть, концептуально, стрелка, где слева значение, а справа тип, невозможна.
[20:13:08] digimmortal вышел(а) из комнаты
[20:17:30] gds вышел(а) из комнаты
[20:18:15] gds вошёл(а) в комнату
[20:36:31] <Kakadu> кто знает, когда надо использовать функторные контейнеры, а когда полиморфные?
[20:37:15] <gds> вот как раз это я тоже хотел бы обсудить.  скоро, скоро.
[20:37:56] <Kakadu> я тут понял, что выбрав неправильные контейнеры я создал себе кучу проблем
[20:38:18] <gds> расскажи подробнее, какие проблемы?
[20:39:11] <Kakadu> ну если кратко, то  я неожиданно не обнаружил у типа-множество функции map
[20:39:39] <Kakadu> у полиморфной map оно есть, а у функцторной нет и понятно почему
[20:40:03] <Kakadu> приходится собирать костыли
[20:41:01] <gds> полиморфное множество -- PSet из extlib/batteries?
[20:41:17] <Kakadu> это Core.Core_set.t
[20:41:29] <Kakadu> но вроде там сходно всё
[20:41:31] <Kakadu> так вот
[20:42:02] <Kakadu> когда я работаю с CoreSet.add Core.empty "мой-супер-элемент"
[20:42:12] <Kakadu> так сразу не понятно какой компаратор работает
[20:42:26] <Kakadu> тьфу
[20:42:35] <Kakadu> Core_set.add Core_set.empty "bla"
[20:43:57] <Kakadu> а компаратор дефолтный мне нужен
[20:43:58] <gds> если не конкретизируешь и оно полиморфно, есть следующие полезные варианты: физическое раввинство ( (==) ) и структурное (Pervasives.compare).
[20:44:34] <Kakadu> вот я хочу в множество ложить тип, инкапсулирующий метод в С++
[20:45:03] <Kakadu> type cpptype = { t_name:string; t_is_const:bool; t_indirections:int; t_is_ref:bool; t_params: cpptype list }
and meth = {  m_res : cpptype;  m_name : string;  m_args : func_arg list;  m_declared : string;  m_out_name : string; }
and func_arg = cpptype * string option (* type and default value *)
[20:45:53] <Kakadu> метод это тип результата, имя, и список аргументов, где аргумент это пара из типа и, возможно, дефолтного значения
[20:46:20] <Kakadu> но мне нужен компаратор который забивает на дефолтные значения
[20:46:55] <gds> ни структурное, ни физическое сравнение не позволят такого.
[20:47:05] <Kakadu> да, я понимаю
[20:47:27] <Kakadu> видимо мне всё-таки без функтурного множества никак
[20:48:03] <gds> и я теперь тоже понял, в чём именно проблема.
как решение -- module Core_set = Set.Make( таки правильный тип и сравнивалка ) в той области видимости, где уже написан код с Core_set.
[21:14:52] bobry- вышел(а) из комнаты
[21:27:06] <gds> в общем, чтобы выродить идеальное решение, мне от модулей не хватает возможности указывать несколько ограничений, типа
# value f ((x : #eq int) : #ord int) = x;
value f :
  (< compare : int -> int -> int; eq : int -> int -> bool; .. > as 'a) -> 'a =
  <fun>
а от объектов не хватает возможности ограничить тип / гарантировать наличие метода так, чтобы был метод типа fmap, отображающий текущее значение с типом, допустим, set 'a, функцией 'a -> 'b, рожая при этом set 'b.  Тогда как в случае модулей типизируется и реализуется просто:
value fmap : ('a -> 'b) -> t 'a -> t 'b;
(но, опять же, тут тип только одного параметра, для двух не покатит уже.)
[21:35:39] <Kakadu> я заметил, labeled аргументы очень сильно помогают
[21:35:51] <Kakadu> я даже начал свои фанки с этим делать
[21:35:56] <Kakadu> спасибо  core
[21:41:16] <gds> labelled -- о да, клёвые.  Даже вне "публичного апи", где-то внутри, код по-любому более читаемый-чоткий выходит.
[21:46:06] shaggie вышел(а) из комнаты
[21:46:08] <Kakadu> надо ещё понять где дефолтные надо использовать.
[21:48:42] <gds> и ещё надо понять, что если аргумент labelled, то либо везде с меткой, либо ловить предупреждения компилятора.
[21:50:21] <Kakadu> gds: я был невнимателен и думал, что это ошибки компилятора )
[21:50:42] <Kakadu> кстати, что это...
[21:50:49] <Kakadu> # let f ~x = x;;
val f : x:'a -> 'a = <fun>
# f 5;;
- : x:(int -> 'a) -> 'a = <fun>
[21:51:22] <Kakadu> как это он так во втором случае тип вывел....
[22:00:43] <gds> предположил, что применяешь функцию "x:'a -> 'a" к аргументу 5.  То есть, что 'a = int -> 'b.  Вот и вышло, что f : x :'a -> 'a == f : x:(int -> 'b) -> (int -> 'b).  А если к этому применить неименованный аргумент с типом int, то будет "x:(int -> 'b) -> 'b)".
[22:10:00] <Kakadu> gds: спасибо, понятно стало
[22:18:14] <bobry> gds: а ты сам не использовал type-conv?
[22:18:53] <gds> bobry: нет, только результаты применения type-conv.
[22:24:53] <gds> одна из претензий к модулям по сравнению с объектами: в случае кода, работающего с кучей разных понятий-сущностей (как следствие, кода, алгоритмически очень простого, иначе можно было бы выделить алгоритм отдельно), оказывается так, что для работы со структурами данных (представьте, что с module MapString = Map.Make(String)) нужно везде знать/помнить/указывать: 1. совершаемую операцию/действие, 2. идентификатор самого значения, с которым работаем, имеющего тип MapString.t, 3. идентификатор модуля, который предоставляет нужные операции.
В случае объектов п.3 не нужен.  mymap#get_exn "asd" -- и всё.
[22:41:18] shaggie вошёл(а) в комнату
[22:42:23] <bobry> gds: кстати а объектная модель реализована полностью независимо от модулей, или все таки там происходит какая то магия по переводу одного в другое?
[22:44:58] <gds> bobry: независимо.  Других вариантов быть не может, если хочется (а хочется) в теории иметь "статически-разрешимые" обращения к элементам модуля (например, чтобы не было "цены абстракции" при работе с модулями).  Однако, конкретно в окамле от этого отошли уже давно, ну и "первоклассные модули" фактически имплементированы как записи, а типизируются, судя по всему, как объекты.
[22:56:30] shaggie вышел(а) из комнаты
[22:56:52] shaggie вошёл(а) в комнату
[23:03:53] ermine устало ввалилась
[23:04:09] <ermine> gds: насчет стрелки - у нее ассоциативность правая
[23:04:34] <ermine> то есть читаем справа налево
[23:04:54] <gds> ermine: и чочо?
[23:05:03] <ermine> а мне нужна вообще-то глубокая инкапсуляция
[23:05:53] <ermine> gds: ну стрелка - get str = str.[0] типизируется как char t -> char из-за правизны
[23:07:23] <gds> нет.  Принципиальный тип тут -- "string -> char".  Если он подгоняется под какую-то стрелку 'a -> 'b, то отдельно string подгоняется под 'a, а char под 'b.  Ассоциативность не причём.
[23:07:47] <gds> ну можно сделать глубокую инкапсуляцию.  Вытащи наружу то, что надо, и всё.
[23:09:44] <ermine> gds: вот вопрос как сделать контейнер с типом элемента 'a, и соответствующий функционал заданного типа
[23:09:53] <ermine> gds: я пока так не умею
[23:10:03] <ermine> хнык
[23:13:11] <gds> ещё древние китайские мудрецы писали, что для качественного разрешения конфликтных взаимодействий необходимо думать не только о том, что нужно тебе, но и о том, что нужно другим.  Предполагаю подумать об этом самостоятельно, так как примеры использования были реквестированы неоднократно.  Лично я не очень хочу тут помогать, видя проблему, в целом решаемую, только с одной стороны.
[23:23:45] <bobry> товарищи, а как понимать SyntaxError в несуществующей строке?
[23:23:55] <bobry> -syntax не используется
[23:25:11] <Kakadu> bobry: номера нет или файл не сказан?
[23:25:30] <bobry> файл сказан, в файле 60 строк
[23:25:33] <bobry> а ошибка в 82й
[23:25:35] <bobry> странно как то
[23:26:01] <Kakadu> у меня было вместо имени файла писало ghost-location, но такого как у тебя не было
[23:26:15] <bobry> Kakadu: а как лечил?
[23:27:20] <Kakadu> смотрел на последнюю команду компиляции и видел имя файла .ml
[23:36:56] shaggie вышел(а) из комнаты: Replaced by new connection
[23:36:56] shaggie вошёл(а) в комнату
[23:45:20] Kakadu вышел(а) из комнаты
[23:46:19] <gds> наконец пришло время опубликовать суперкод, делающий из манатки+sequence и функтора функцию mapM поверх этой манатки.  То, для чего х-югам требуется далеко не только fmap от того, чему в окамле достаточно предоставлять только fmap.  https://bitbucket.org/gds/amall/src/tip/src/mapM.ml
[23:54:36] <ermine> еле скрипящую шерестенками центрального процессора машины?
[23:55:03] shaggie вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!