2015-01-27 8 views
6

Qualcuno può spiegare * cosa sono gli obiettivi? In termini di OCaml?Cosa sono ** gli obiettivi ** nel mondo di OCaml

Ho provato a google, ma quasi tutti sono nel mondo di Haskell.

solo che alcune dimostrazioni semplici per esso nel mondo di OCaml, come quello che è, ciò che può essere utilizzato per, ecc

+1

Stai parlando di cose come il boomerang? https://alliance.seas.upenn.edu/~harmony/ – PatJ

+0

@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 –

risposta

8

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

+0

Il 'set' è imperativo o funzionale? –

+0

funzionale, si noti la funzione sopra restituisce ''a', non' unità'. – nlucaroni

+0

Questi erano originariamente chiamati riferimenti funzionali; questo può aiutare quando si cercano ulteriori informazioni. – nlucaroni