Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Probleme avec des enregistrements
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Bruno Pagano <pagano@a...>
Subject: Re: [Caml-list] Probleme avec des enregistrements
> J'utilise la version 3.04 de caml.
> Je veux utiliser des enregistrements dont certains
> des champs portent le meme nom. Cela ne fonctionne pas.
> Ainsi:
> 
> <cime:479> ./ocaml
>         Objective Caml version 3.04
> 
> # type t1={a:int ; b:int} ;;
> type t1 = { a : int; b : int; }
> # type t2 = {a:int} ;;
> type t2 = { a : int; }
> # {a=2} ;;
> - : t2 = {a = 2}
> # {a=1;b=2} ;;
> The record field label b belongs to the type t1
> but is here mixed with labels of type t2
> #
> 
> 
> Il n'y a pourtant aucune ambiguite sur le type de
> {a=1;b=2} !
> Est-ce un bug connu ?
> 

Ce n'est pas un bug mais le prix a payer pour avoir la synthese de 
types dans le langage. En effet, si on ecrit la fonction suivante :

let access x = x.a ;;

Ocaml va deduire (inferer) que access est une fonction de type t2 -> int.
La seule information qu'il utilise est que ".a" signifie le champs 
"a" d'une valeur de type t2. Si cette information etait ambigue (t1 ou t2),
alors ocaml ne pourrait plus typer la fonction access ... ni grand chose
d'autre d'ailleurs.

C'est pour cette meme raison qu'il est peu de chance d'avoir un jour
de la surcharge de noms en ocaml.


Il existe cependant une possibilite pour separer les espaces de noms en 
utilisant des modules :
  si t1 et t2 sont declares dans des modules differents, ils
  peuvent avoir les memes identificateurs pour leurs champs.

module M1 = struct
  type t1 = { a : int ; b : int }
end

module M2 = struct
  type t2 = { a :int }
end

let v1 = { M1.a=1 ; M1.b=2 } ;;

(* ou encore *)

let access x = x.M2.a ;;

(* on reproduit l'erreur en ecrivant :  *)

{ M2.a = 1 ; M1.b =2 } ;;
The record field label M1.b belongs to the type M1.t1
but is here mixed with labels of type M2.t2


Cela peut paraitre contraignant de devoir donner des identificateurs
differents pour tous les champs d'un meme module; mais c'est une convention
de programmation qui me semble plutot saine, meme pour d'autres langages.

Bonne continuation avec caml.

Bruno Pagano
-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs  FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr  Archives: http://caml.inria.fr