Home
OCaml (aka Objective Caml), а также прочие ML'и, F#, Coq, etc
ocaml@conference.jabber.ru
Среда, 15 ноября 2017< ^ >
f[x] установил(а) тему: OCaml / ОКэмл / Камль -- http://ocaml.org/ | Камло - http://camlunity.org/ | Верблюды грязи не боятся! | release crap, enjoy NIH | репортьте баги официальным дилерам | ocaml мёртв и тормозит, move on | stdlib only? - ССЗБ | Fight FUD with fire | Мойте руки перед чатом | KEEP CAML AND CURRY ON | У верблюда два горба потому что жизнь борьба | Coq далее доказывает в coq@c.j.r | F# - де-факто онтопик
Конфигурация комнаты
Участники комнаты

GMT+3
[00:09:32] komar вышел(а) из комнаты: Connection failed: connection closed
[00:49:38] komar вошёл(а) в комнату
[01:52:53] Kakadu вышел(а) из комнаты
[02:01:02] vladimir.chujkov вошёл(а) в комнату
[02:37:00] komar вышел(а) из комнаты
[08:12:33] begemot_sun вошёл(а) в комнату
[10:24:10] grouzen вошёл(а) в комнату
[10:42:59] grouzen вышел(а) из комнаты
[12:13:09] f[x] вошёл(а) в комнату
[14:19:26] Kakadu вошёл(а) в комнату
[15:04:32] Kakadu вышел(а) из комнаты
[15:39:05] komar вошёл(а) в комнату
[15:48:40] grouzen вошёл(а) в комнату
[16:30:20] grouzen вышел(а) из комнаты
[16:30:23] grouzen вошёл(а) в комнату
[16:31:10] <aleksey> а если сказать, что целые имеют тип [ `Int ], а вещественные [ `Int | `Float ] и объявить
plus : ([< `Int | `Float > `Int ] as 'a) -> 'a -> 'a
то компилятор будет понимать, что для двух целых аргументов результат будет целый, а если хоть один вещественный -- то результат вещественный?
[16:48:10] komar вышел(а) из комнаты: Connection failed: connection closed
[16:53:39] <f[x]> неа
[16:53:59] <f[x]> тут какие-то gadt'ы нужны или экзистенциализм
[17:01:40] <aleksey> а почему не-а?
[17:05:00] <f[x]> замени [`Int|`Float] на type t = Int | Float
[17:05:09] <f[x]> 'a это тип, тип один и тот же
[17:05:27] <f[x]> значение из двух конструкторов
[17:05:43] <f[x]> хотя я не очень понял часть про "вещественные [ `Int | `Float ]"
[17:06:44] <f[x]> тип должен унифицироваться во что-то
[17:10:06] <f[x]> # let plus : ([< `Int | `Float > `Int ] as 'a) -> 'a -> 'a = fun x y -> if true then x else y;;
val plus : ([< `Float | `Int > `Int ] as 'a) -> 'a -> 'a = <fun>
# plus;;
- : ([< `Float | `Int > `Int ] as 'a) -> 'a -> 'a = <fun>
# let x = `Int;;
val x : [> `Int ] = `Int
# let y = `Int ;;
val y : [> `Int ] = `Int
# let z = `Float;;
val z : [> `Float ] = `Float
# let g = `Float;;
val g : [> `Float ] = `Float
# plus z g;;
- : [ `Float | `Int ] = `Float
# plus x y;;
- : [< `Float | `Int > `Int ] = `Int
# plus x g;;
- : [ `Float | `Int ] = `Int
[17:10:30] <aleksey> добавь z : [ `Float | `Int ]
[17:10:59] <f[x]> # let zz : [`Float | `Int] = `Float;;
val zz : [ `Float | `Int ] = `Float
# plus zz zz;;
- : [ `Float | `Int ] = `Float
[17:11:03] <f[x]> так а что
[17:11:11] <aleksey> # asd;;
- : ([< `A | `B > `A ] as 'a) -> 'a -> 'a = <fun>
# fun x -> (asd `A x);;
- : ([< `A | `B > `A ] as 'a) -> 'a = <fun>
# fun x -> (asd `B x);;
- : [ `A | `B ] -> [ `A | `B ] = <fun>
[17:11:14] <f[x]> результирующий тип всегда [`float|`int]
[17:11:19] <f[x]> максимально общий
[17:12:37] <aleksey> ну потому вещественные и хочу `Int | `Float чтоб оно надмножеством было
[17:24:01] <aleksey> с gadt оказывается нельзя вариантность указывать
[17:29:14] <f[x]> так я не пойму
[17:29:19] <f[x]> не получается же, правильно?
[17:29:24] <f[x]> с полуморфными вариантами
[17:29:36] <f[x]> # fun x -> (asd `A x);;
- : ([< `A | `B > `A ] as 'a) -> 'a = <fun>
[17:29:49] <f[x]> [< `A | `B > `A ] это же всё-таки не `A
[17:30:47] <aleksey> тот же тип что у x
[17:31:00] <aleksey> если дать целое, вернёт целое
[17:31:34] <aleksey> не получается их в gadt запихать
[17:32:56] <f[x]> # plus x;;
- : [ `Int ] -> [ `Int ] = <fun>
# plus zz;;
- : [ `Float | `Int ] -> [ `Float | `Int ] = <fun>
[17:33:01] <f[x]> :thinking_face:
[17:33:59] <f[x]> # plus zz x;;
Characters 8-9:
  plus zz x;;
         ^
Error: This expression has type [ `Int ]
       but an expression was expected of type [ `Float | `Int ]
       The first variant type does not allow tag(s) `Float
[17:34:07] <f[x]> так это победа получается
[17:34:22] <aleksey> или так получается:
type _ num =
  | Int : int -> [> `Int ] num
  | Float : float -> [< `Int | `Float > `Int ] num
let plus : (([< `Int | `Float > `Int ] as 'a) num) -> 'a num -> 'a num =
  fun x y ->
  match x, y with
    | Int a, Int b -> Int (a + b)
    | Int a, Float b -> Float (float_of_int a +. b)
    | Float a, Int b -> Float (a +. float_of_int b)
    | Float a, Float b -> Float (a +. b)
[17:35:16] <f[x]> с gadt'ами наверное можно и без полуморфов
[17:35:23] <f[x]> там любой тэг сгодится, не?
[17:35:30] <aleksey> или нет
[17:35:56] <aleksey> а как без них?
[17:35:57] <f[x]> таки тут другое
[17:36:09] <f[x]> вон же два кейса для мисматча типов
[17:36:26] <f[x]> сорри, у меня тут ES рушится, убежал
[17:38:58] <aleksey> я неправильно тип объявил, так Float не надмножетсво Int
[18:14:50] vladimir.chujkov вышел(а) из комнаты
[18:16:56] vladimir.chujkov вошёл(а) в комнату
[18:25:18] vladimir.chujkov вошёл(а) в комнату
[18:36:20] vladimir.chujkov вышел(а) из комнаты
[19:19:12] grouzen вышел(а) из комнаты
[19:19:45] f[x] вышел(а) из комнаты
[19:19:49] vladimir.chujkov вышел(а) из комнаты
[19:19:58] begemot_sun вышел(а) из комнаты
[19:46:36] grouzen вошёл(а) в комнату
[20:03:59] aleksey вышел(а) из комнаты
[20:04:08] aleksey вошёл(а) в комнату
[21:26:56] Kakadu вошёл(а) в комнату
[22:32:51] f[x] вошёл(а) в комнату
[23:37:53] <aleksey> f[x]: фантомными типами получается, а с gadt никак
[23:40:19] f[x] вышел(а) из комнаты
Powered by ejabberd - robust, scalable and extensible XMPP server Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!