Что такое * * линзы* * в мире 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) конкретного функтора может выполнять эти операции (установить и получить и очень полезно функцию обновления).