什么是OCaml世界中的**镜头**

Jac*_*ale 6 ocaml lenses

任何人都可以用OCaml解释*什么是镜头?

我试图谷歌它,但几乎所有这些都在Haskell的世界.

只想在OCaml的世界中为它做一些简单的演示,比如它是什么,它可以用于什么,等等.

nlu*_*oni 8

镜头是一对数据结构下的函数(getter和setter).这真的很简单.目前有一个图书馆供他们使用,

type ('s,'a) t =
  { get : 's -> 'a;
    set  : 'a -> 's -> 's; }
Run Code Online (Sandbox Code Playgroud)

一个例子(使用上面列出的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
Run Code Online (Sandbox Code Playgroud)

在将镜头组合在一起时,您可以将其视为避免with在处理记录时不断写入的一种方法.您还可以看到创建这些镜头的ppx将非常有用.Yaron最近在caml-list上发布了他们正在研究类似于镜头的东西.

van Laarhoven Lens定义(PDF)中的一个重要见解显示fmap了特定Functor的一个函数()如何执行这些操作(设置和获取并非常有用地执行更新功能).