Un obiettivo è una coppia di funzioni (getter e setter) che sono sotto di un data -struttura. È davvero così semplice. Attualmente v'è una library per loro,
type ('s,'a) t =
{ get : 's -> 'a;
set : 'a -> 's -> 's; }
Un esempio (utilizzando la libreria ocaml elencati sopra) per un sarto,
type measurements = { inseam : float; }
type person = { name : string; measurements : measurements; }
let lens_person_measurements =
{ get = (fun x -> x.measurements);
set = (fun a x -> {x with measurements = a}); }
let lens_measurements_inseam =
{ get = (fun x -> x.inseam);
set = (fun a x -> {x with inseam = a}); }
let lens_person_inseam =
compose lens_measurements_inseam lens_person_measurements
Durante la composizione delle lenti insieme, si può vedere come un modo per evitare di dover scrivere costantemente with
quando si ha a che fare con i record. Puoi anche vedere che un ppx per creare questi obiettivi sarebbe molto utile. Yaron recently posted on the caml-list stanno lavorando a qualcosa che sarebbe simile all'obiettivo.
Un'idea importante nella van Laarhoven Lens definition(PDF) mostra come una funzione (fmap
) di un particolare Functor può fare queste operazioni (set e ricevere e molto gentile una funzione di aggiornamento).
Stai parlando di cose come il boomerang? https://alliance.seas.upenn.edu/~harmony/ – PatJ
@PatJ no, sto parlando della cosa obiettivo in Haskell, ma anche OCaml ce l'ha. https://www.fpcomplete.com/school/to-infinity-and-beyond/pick-of-the-week/basic-lensing –