2010-10-26 29 views
7

J'ai une question très simple concernant les enregistrements OCaml. Supposons que j'ai un dossier défini:Copie des champs dans OCaml

type r = {a:int;b:int;c:int} 
let x = {a=3;b=8;c=2} 

Maintenant, supposons que je veux créer un nouveau dossier qui a tous les champs égal à x mais qui a c = 4. Je pourrais écrire:

let y = {a=3;b=8;c=4} 

mais cela est ennuyeux car il n'y a pas besoin de ré-écrire a = 3 et b = 8. Je pourrais également écrire:

let y = {a=x.a;b=x.b;c=4} 

mais ce n'est toujours pas bon si l'enregistrement a beaucoup de champs. Est-il possible d'écrire quelque chose comme:

let y = {x with c=4} 

ou quelque chose du genre?

Merci beaucoup pour votre aide.

Tout le meilleur, Surikator.

Répondre

15

Oui, et c'est la syntaxe exacte.

let y = {x with c=4} 
+1

Lol ... Pourquoi pas ça ?! Des trucs géniaux. Merci! – Surikator

+0

Ouais, l'intuition assez impressionnante que vous avez là. – nlucaroni

+1

Pour une définition de type donnée, '{x avec c = 4}' est équivalent à '{a = x.a; b = x.b; c = 4}'. Cependant, si vous changez le type d'enregistrement pour ajouter ou supprimer un champ, le compilateur ne vous avertira pas de l'ancien, ce qui peut être exactement ce que vous voulez ou pas ce que vous voulez. C'est ainsi que vous devriez choisir entre les deux notations. –