1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
(* flexrecord.sml *)
(* Checks type inference for flexible records. *)
(* flexrecord1 *)
fun f(r as {...}) =
let
fun g() = r
in
[r, {a=1}]
end;
(* flexrecord1 *)
(* flexrecord2 *)
val _ =
let
val g = #foo
val _ = g {foo = 13}
val _ = g {foo = "yes"}
in
()
end
(* flexrecord2 *)
(* flexrecord3 *)
val _ =
let
val g = #foo
val _ = g {foo = 13, goo = 1.0}
val _ = g {foo = "yes", goo = 1.0}
in
()
end
(* flexrecord3 *)
(* flexrecord4 *)
val _ =
let
val g = #foo
val _ = g {foo = 13, goo = 1.0}
val _ = g {foo = "yes", goo = false}
in
()
end
(* flexrecord4 *)
(* flexrecord5 *)
val _ =
let
val f = #foo
val g = fn h => fn y => h (f y)
val h = fn x => f x
val _ = f {foo=0, bar=1}
in
()
end
(* flexrecord5 *)
(* flexrecord6 *)
val _ =
fn x =>
let
val _: string = #1 x
fun id z = z
fun g () =
let
val (_, a) = x
in a
end
in
g ()
end
(* flexrecord6 *)
(* flexrecord7 *)
val _ =
let
fun f r = { a = #a r, b = #b r }
val _ = f { a = 0.0, b = 0.0 }
in
()
end
(* flexrecord7 *)
(* flexrecord8 *)
val _ =
fn _ =>
let
val f = #foo
val g = (fn x => x) f
val _ = f {foo=0, bar=1}
in
()
end
(* flexrecord8 *)
(* flexrecord9 *)
val g = fn {...} => ()
and h = fn () => ()
val () = (h (); g {a = 13})
(* flexrecord9 *)
|