6

谁能用 OCaml 解释 *什么是镜头?

我试图用谷歌搜索它,但几乎所有这些都在 Haskell 的世界中。

只希望在 OCaml 的世界中对它进行一些简单的演示,比如它是什么,它可以用来做什么等。

4

1 回答 1

7

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

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 会非常有帮助。Yaron 最近在 caml-list 上发布了他们正在研究类似于镜头的东西。

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

于 2015-01-28T17:08:03.677 回答