如何将 Lens 定义为 State 值本身?

How to define Lens into the State value itself?

在尝试理解 State monad 和 Lens 的使用时,我得出了一个简单计数器的 lens 的非常简单的定义:

self :: ASetter s s s s
self = ($)

incrementUsingLens :: State Int ()
incrementUsingLens = self %= (+1)

自从

type ASetter s t a b = (a -> Identity b) -> s -> Identity t

在我的例子中只是

type ASetter s s s s = (s -> Identity s) -> s -> Identity s

这确实是将镜头定义为状态变量的正确定义吗?我担心我可能会遗漏一些规律或其他假设。

是的,($),也叫id,也是镜头包表示中的镜头。虽然这里我们有 getputmodify 也同样有效,但身份镜头有时仍然有用。

lens 称这个无所事事的光学器件 simple。请注意,simple 是一个 Equality,而 Equality 位于光学层次结构的最底部,这意味着您不仅可以将其用作无所事事 setter,也可用作无用镜头、棱镜等

I'm worried that I might be missing some laws or other assumptions.

setter 定律说,对于 foo setter,over foo 应该遵循函子定律:

over foo id = id
over foo (g . f) = over foo g . over foo f

如果你用 simple/id 试试这个,你会发现这些定律是微不足道的。其他光学定律也是如此。