Posté par benja .
En réponse au journal Données vs Code.
Évalué à 3.
Dernière modification le 29 mars 2016 à 16:42.
Mon exemple ne marche pas et ça tombe bien car cella montre bien que les classe ocaml ne sont pas comme des classes de poo. T'es bien obligé de changer la signature de validated (comme avec les objets immédiats) pour ne pas qu'il soit considéré comme un sous-type de base.
(* c'est accepté par le compilo car le type validated est un sous type de base *)use_valid_string(newbase"invalid")(*- : bytes = "invalid" *)(* on peut faire *)class['a]validatedfi=let_=ifnot(fi)thenfailwith"invalid"inobjectinherit['a]baseimethodvalid=trueend;;letuse_valid_string(o:_validated)=print_endlineo#get;;use_valid_string(newbase"invalid");;(*Error: This expression has type bytes base but an expression was expected of type bytes validated The first object type has no method valid *)(* ouf... *)
On peut aussi combiner avec un phantom type pour un maximum de safety. Attention, si on retire la méthode repr, ça ne marche à nouveau plus.
class['a,'b]anyrepri=object(self)(* on est obligé de rendre la representation publique ! *)methodrepr:'b=reprimethodget:'a=iend;;type'avalid(* notre type fantome *)class['a,'b]validatedrepri=(* ici on force la validation, commenté car i'm lazy *)(* let _ = repr i in *)objectconstraint'b='avalidinherit['a,'b]anyrepriend(* on passe au constructeur une fonction qui "valide" en construisant le type fantome *)(* le but de cette fonction c'est d'avoir une version spécialisée du constructeur, via l'annotation de type sur repr. on peut s'en passser...*)letmake_validated(repr:'a->'avalid)obj=newvalidatedreprobj#getletuse_validated(o:_validated)=o#getletuse_anyo=o#getletidx=xuse_validated(newanyid"invalid");;(*Error: This expression has type (bytes, bytes) any but an expression was expected of type (bytes, bytes valid) validated Types for method repr are incompatible*)use_validated(make_validated(fun_->failwith"i am lazy")(newanyid"plain"));;(* - : bytes = "plain" *)(* et on peut toujours utiliser un string validated pour un string any *)use_any(make_validated(fun_->failwith"i am lazy")(newanyid"plain"));;(* - : bytes = "plain" *)
S'il y en a par ici qui ont une solution pour cacher repr ?
[^] # Re: ouai
Posté par benja . En réponse au journal Données vs Code. Évalué à 3. Dernière modification le 29 mars 2016 à 16:42.
Mon exemple ne marche pas et ça tombe bien car cella montre bien que les classe ocaml ne sont pas comme des classes de poo. T'es bien obligé de changer la signature de validated (comme avec les objets immédiats) pour ne pas qu'il soit considéré comme un sous-type de base.
On peut aussi combiner avec un phantom type pour un maximum de safety. Attention, si on retire la méthode repr, ça ne marche à nouveau plus.
S'il y en a par ici qui ont une solution pour cacher repr ?