use types to disambiguate record access
git-svn-id: http://caml.inria.fr/svn/ocaml/branches/record-disambiguation@12934 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02master
parent
15ac0e835b
commit
afa71dbea2
|
@ -27,3 +27,17 @@ end;;
|
|||
(* path abbreviation is syntactic *)
|
||||
let f {M.x; y} = x+y;; (* fails *)
|
||||
let r = {M.x=1; y=2};; (* fails *)
|
||||
|
||||
(* Use type information *)
|
||||
let f (x:Complex.t) = x.re;;
|
||||
let f x = ignore (x:Complex.t); x.re;; (* non principal *)
|
||||
module M = struct
|
||||
type t = {x:int}
|
||||
module N = struct type s = t = {x:int} end
|
||||
type u = { x:bool}
|
||||
end;;
|
||||
let f (r:M.u) = r.x;;
|
||||
let f (r:M.t) = r.x;; (* fails *)
|
||||
open M.N;;
|
||||
let f r = r.x;;
|
||||
let f (r:M.t) = r.x;; (* ok *)
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
|
||||
# type t = { x : int; y : int; }
|
||||
# Characters 5-6:
|
||||
{x=3;z=2};;
|
||||
^
|
||||
Error: Unbound record field label z
|
||||
# Characters 9-10:
|
||||
fun {x=3;z=2} -> ();;
|
||||
^
|
||||
Error: Unbound record field label z
|
||||
# Characters 26-34:
|
||||
{x=3; contents=2};;
|
||||
^^^^^^^^
|
||||
Error: The record field label Pervasives.contents belongs to the type
|
||||
'a ref but is mixed here with labels of type t
|
||||
# type u = private { mutable u : int; }
|
||||
# Characters 0-5:
|
||||
{u=3};;
|
||||
^^^^^
|
||||
Error: Cannot create values of the private type u
|
||||
# Characters 11-12:
|
||||
fun x -> x.u <- 3;;
|
||||
^
|
||||
Error: Cannot assign field u of the private type u
|
||||
# module M : sig type t = { x : int; y : int; } end
|
||||
# val f : M.t -> int = <fun>
|
||||
# val r : M.t = {M.x = 1; y = 2}
|
||||
# val z : int = 3
|
||||
# module M : sig type t = { x : int; y : int; } type u = { y : bool; } end
|
||||
# Characters 43-51:
|
||||
let f {M.x; y} = x+y;; (* fails *)
|
||||
^^^^^^^^
|
||||
Error: This pattern matches values of type M.u
|
||||
but a pattern was expected which matches values of type M.t
|
||||
# Characters 16-17:
|
||||
let r = {M.x=1; y=2};; (* fails *)
|
||||
^
|
||||
Error: The record field label M.y belongs to the type M.u
|
||||
but is mixed here with labels of type M.t
|
||||
# val f : Complex.t -> float = <fun>
|
||||
# Characters 32-36:
|
||||
let f x = ignore (x:Complex.t); x.re;; (* non principal *)
|
||||
^^^^
|
||||
Warning 18: this type-based field selection is not principal.
|
||||
val f : Complex.t -> float = <fun>
|
||||
# module M :
|
||||
sig
|
||||
type t = { x : int; }
|
||||
module N : sig type s = t = { x : int; } end
|
||||
type u = { x : bool; }
|
||||
end
|
||||
# val f : M.u -> bool = <fun>
|
||||
# Characters 16-17:
|
||||
let f (r:M.t) = r.x;; (* fails *)
|
||||
^
|
||||
Error: This expression has type M.t but an expression was expected of type
|
||||
M.u
|
||||
# # val f : M.N.s -> int = <fun>
|
||||
# val f : M.t -> int = <fun>
|
||||
#
|
|
@ -37,4 +37,20 @@ Error: This pattern matches values of type M.u
|
|||
^
|
||||
Error: The record field label M.y belongs to the type M.u
|
||||
but is mixed here with labels of type M.t
|
||||
# val f : Complex.t -> float = <fun>
|
||||
# val f : Complex.t -> float = <fun>
|
||||
# module M :
|
||||
sig
|
||||
type t = { x : int; }
|
||||
module N : sig type s = t = { x : int; } end
|
||||
type u = { x : bool; }
|
||||
end
|
||||
# val f : M.u -> bool = <fun>
|
||||
# Characters 16-17:
|
||||
let f (r:M.t) = r.x;; (* fails *)
|
||||
^
|
||||
Error: This expression has type M.t but an expression was expected of type
|
||||
M.u
|
||||
# # val f : M.N.s -> int = <fun>
|
||||
# val f : M.t -> int = <fun>
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue