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 }
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. –
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). –