Obiektyw jest parę funkcji (getter i setter), które są pod dane -Struktura. To naprawdę takie proste. Obecnie istnieje library dla nich
type ('s,'a) t =
{ get : 's -> 'a;
set : 'a -> 's -> 's; }
przykład (przy użyciu SML biblioteki wymienione powyżej) do krawca,
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
Podczas tworzenia soczewek razem, można zobaczyć go jako sposób na unikaj konieczności pisania with
stale podczas pracy z rekordami. Możesz również zobaczyć, że ppx do tworzenia tych soczewek byłby bardzo pomocny. Yaron recently posted on the caml-list pracują nad czymś, co byłoby podobne do obiektywu.
Ważny wgląd w van Laarhoven Lens definition(PDF) pokazuje, w jaki sposób jedna funkcja (fmap
) danego Funktora może wykonywać te operacje (ustawić i uzyskać i bardzo pomocna funkcja aktualizacji).
Czy mówisz o rzeczach takich jak bumerang? https://alliance.seas.upenn.edu/~harmony/ – PatJ
@PatJ nie, mówię o rzeczach z obiektywów w Haskell, ale OCaml też to ma. https://www.fpcomplete.com/school/to-infinity-and-beyond/pick-of-the-week/basic-lensing –