Home
Objective Caml
ocaml@conference.jabber.ru
Воскресенье, 20 марта 2011< ^ >
ygrek установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Вики -- http://gdsfh.dyndns.org/kamlo/ | Верблюды грязи не боятся! | release crap, enjoy NIH | репортьте баги официальным дилерам | ocaml мёртв, move on | Здесь бывает ermine!!111
Конфигурация комнаты
Участники комнаты

GMT+3
[00:04:55] Typhon вышел(а) из комнаты
[00:06:57] gds вышел(а) из комнаты
[01:00:41] ygrek вышел(а) из комнаты
[01:14:48] Kakadu вышел(а) из комнаты
[02:16:28] komar вышел(а) из комнаты
[02:22:35] Typhon вошёл(а) в комнату
[04:45:28] Typhon вышел(а) из комнаты
[09:46:21] ygrek вошёл(а) в комнату
[09:59:56] Kakadu вошёл(а) в комнату
[10:02:50] Kakadu вышел(а) из комнаты
[10:14:57] iNode вошёл(а) в комнату
[10:32:59] Kakadu вошёл(а) в комнату
[10:48:20] ygrek вышел(а) из комнаты
[10:55:00] ygrek вошёл(а) в комнату
[11:07:07] gds вошёл(а) в комнату
[11:37:29] iNode вышел(а) из комнаты
[12:22:31] <gds> а вот теперь появились сомнения в том, что правильно сделал с типа-dbi.  А именно, на окамловской стороне представляю значения как [= `Null | `String of string | `Int of int | ...], а можно было бы и по-другому: [= `String of option string | `Int of option int | ...], то есть, различать нуллы по типам.  Это было бы полезно хотя бы тем, что знаем, какого типа столбец, даже если там NULL.  Кроме того, паттерн-матчинг массива становится [| `Int64 id; `String name; `Date d |], вместо [| `Int64 id; `String name; (`Date _ | `Null) as d_opt |] -> match d_opt with [ `Null -> ... | `Date d -> ... ]
[12:24:51] <gds> или же написать преобразовалку [= `Null | `String of string | `Int of int | ... ] в [ `String of option string | `Int of option int | ... ] для удобства паттерн-матчинга?  Или наделать всяких get_int_opt, get_date_opt, которые `Null -> None | `Int i -> Some i | _ -> raise Type_error?  Или которые вдобавок пытаются, для случая get_int_opt, преобразовывать `Int32|`Int64|`String в int, если получится?
[12:25:53] <ygrek> пользователь в идеале не будет делать всё это руками - cf sqlexpr, sqlgg, pgocaml, etc
[12:26:10] komar вошёл(а) в комнату
[12:26:26] <ygrek> т.е. типы надо делать в первую очередь быстрыми - минимум боксинга, а потом поверх этого удобными для человека
[12:27:33] <gds> с одной стороны -- понял.  Но тут концептуальный момент (который я первым описал) -- субедешечька даёт ведь мне тип (например INT2 "" дало для smallint, равного null), а в этом типе (назовём его sql_t) эта информация теряется, доводясь до `Null.
[12:27:48] <ygrek> например type t val get_int : t -> int val get_int_opt : t -> int option (* для NULL *) val is_null : t -> bool ...
[12:29:45] <ygrek> а лучше даже type row val get_int : t -> int -> int val get_string : t -> int -> string итд
[12:30:03] <ygrek> где второй параметр это индекс в рядке
[12:31:08] <ygrek> т.е. оптимизируй под частый случай - когда информация о типе колонки известна заранее
[12:31:40] ygrek scratches his own itch как всегда
[12:34:27] <gds> с точки зрения оптимизации -- да, грамотная идея про row -> int -> string.  И в случае "автоматизации" будет отсутствовать лишнее оборачивание, т.е. будет либо сразу значение, либо исключение, что быстро.
Однако у меня уже такая штука, что уже привязан кое-где к sql_t, и в целом нужно иногда подсматривать типы БД, то есть, не статика.  Поэтому я учту, что row -> int -> string нужно будет как-то грамотно поддерживать без оборачивания, но чуть позднее.
[12:34:28] <ygrek> с другой стороны юзер может захотеть посмотреть данные в сыром виде, тогда лучше давать обе функции :) t -> `Null | `Int of int | ... и t -> `Int of int option | `String of string option | ...
[12:35:18] <ygrek> давать первое плюс преобразовалку плохо как ты описал, давать вторую и преобразовалку плохо потому что лишний боксинг
[12:35:27] <ygrek> поэтому надо давать обе
[12:40:44] <gds> тоже идея.  В принципе, у меня есть уже sql_u = [= `Null | `String of string | `Binary of string ], которое полу-typed (всё впихивается в эти конструкторы), все классы параметризованы типом результата, и подключить дополнительную преобразовалку Postgres.ftype -> string -> sql_без_нулла_с_опциями -- это я смогу.
Но особенности работы с dbi у меня две: 1. пишу руками, а не генерю, оттого и лёгкая попоболь в преобразовании Postgres.ftype -> string -> новый_тип (да и генерилка не упростила бы особо), 2. пишу в ленивом режиме, исключительно on demand, потому что ещё куча проектов при делах (например, тот же message passing), и куча непосредственно софта, поэтому писать всё сразу и сразу грамотно писать -- это я точно ниасилю.  А вот как бы сделать так, чтобы не пришлось многое ломать -- это в первую очередь важно.
[12:48:43] <gds> ygrek: во, ещё вопрос.  А все ли субедешечьки дают тип в случае колонок со значением null?  По идее -- да, кроме извратных случаев вида "select null;" (да, кстати, что с ними делать в рамках [= String of option string | ... ]?).
[12:53:02] ygrek хз, я вообще sql поверхностно использую
[13:15:23] <gds> не в курсе, где бы моттла выцепить сейчас в IM-подобном стиле?  чятик/ирц какое, или его там нет?  (т.к. мыло -- долго, а вопрос срочный)
[13:21:45] <gds> а хотя лучше забьём, он не ответит на вопрос.  проехали.
[13:42:35] Typhon вошёл(а) в комнату
[13:58:12] arhibot вошёл(а) в комнату
[15:35:14] iNode вошёл(а) в комнату
[16:34:33] komar вышел(а) из комнаты
[17:13:11] ygrek вышел(а) из комнаты
[17:13:31] ygrek вошёл(а) в комнату
[17:13:31] ygrek вышел(а) из комнаты
[17:13:37] ygrek вошёл(а) в комнату
[17:28:16] ygrek вышел(а) из комнаты: Replaced by new connection
[17:28:18] ygrek вошёл(а) в комнату
[17:38:12] arhibot вышел(а) из комнаты
[18:11:21] Typhon вышел(а) из комнаты: Replaced by new connection
[18:11:23] Typhon вошёл(а) в комнату
[18:12:23] Typhon вышел(а) из комнаты
[18:12:44] Typhon вошёл(а) в комнату
[18:21:31] komar вошёл(а) в комнату
[18:52:43] <Typhon> gds, в kamlo/Res есть "open Am_Ops" -- что это за модуль?
[18:55:30] <Typhon> предугадываю, что это операторы инфиксные
[19:15:13] ygrek вышел(а) из комнаты
[19:15:46] ygrek вошёл(а) в комнату
[19:19:44] <gds> Typhon: о да.  Am_-префикс -- особая история, но операторы те же.  Кстати, вероятно с Num буду работать скоро, так там появятся модули с Num так же, как и с Int32, Int64, Float, но не знаю, стоит ли, ибо зависимости и все дела.  Может быть, ops_num.ml какие-нибудь отдельно, посмотрим.
[19:20:13] iNode вышел(а) из комнаты
[19:27:30] <gds> пофиксил kamlo/Res
[21:45:12] avysk вошёл(а) в комнату
[21:45:18] avysk вышел(а) из комнаты
[22:41:46] ygrek вышел(а) из комнаты: Replaced by new connection
[22:41:47] ygrek вошёл(а) в комнату
[23:19:11] gds вышел(а) из комнаты
[23:33:50] avysk вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!