2017-09-24 5 views
0

Existe-t-il un moyen, en utilisant éventuellement une extension ppx ou similaire, d'utiliser la syntaxe de mise à jour fonctionnelle { record with key = value } avec un enregistrement imbriqué?OCaml mise à jour fonctionnelle avec enregistrement imbriqué

Par exemple, dans l'exemple de programme suivant, je ne fais la mise à jour fonctionnelle que de l'enregistrement le plus externe, lorsque je veux vraiment cibler un enregistrement "interne".

type outer = { 
    a : float; 
    b : inner 
} 
and inner = { 
    c : float; 
} 

let item = { a = 0.4; b = { c = 0.7 } } 

let() = ignore { item with b = { c = 0.8 } 

Il devient moins pratique si inner a plus d'un champ.

Je voudrais pouvoir écrire quelque chose comme ce qui suit (syntaxe strawman):

let() = ignore { item with b.c = 0.8 } 

Répondre

1

Vous pouvez écrire en OCaml droite:

{ item with b = { item.b with c = 0.8 } } 

Je suppose que vous utilisez ignore juste pour les exemples; cela n'a pas de sens d'ignorer le résultat d'une mise à jour d'enregistrement fonctionnelle.

+0

Il semble que, dans un certain sens, la réponse est "non" alors. Il semble que 'key' dans' {record with key = value} 'ne peut être qu'un seul champ et qu'il n'y a pas d'extensions couramment utilisées qui permettraient plus de choses dans la position' key' ... et peut-être desugar dans plusieurs mises à jour fonctionnelles comme ceci. –

+0

Oui, la grammaire de OCaml droite appelle un * champ * après 'avec '. C'est un identificateur unique éventuellement précédé des noms des modules contenant (où le type d'enregistrement est défini). –