Что такое * * линзы* * в мире OCaml
может ли кто-нибудь объяснить *что такое линзы с точки зрения OCaml?
Я попытался google, но почти все они находятся в мире Хаскелла.
просто пожелайте несколько простых демонстраций для него в мире OCaml, например, что это такое, для чего его можно использовать и т. д.
1 ответов
объектив-это пара функций (геттер и сеттер), которые находятся под структурой данных. Все очень просто. В настоящее время библиотека для них,
type ('s,'a) t =
{ get : 's -> 'a;
set : 'a -> 's -> 's; }
пример (используя библиотеку ocaml, указанную выше) для портного,
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
при составлении линз вместе, вы можете увидеть это как способ избежать необходимости писать with
постоянно при работе с записями. Вы также можете видеть, что ppx для создания этих объективов будет очень полезно. Ярон недавно опубликовал на caml-list они работают над чем-то, что было бы похоже на объектив.
важное понимание в определение объектива van Laarhoven (PDF) показывает, как одна функция (fmap
) конкретного функтора может выполнять эти операции (установить и получить и очень полезно функцию обновления).