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

时间:2017-04-26 20:25:43

标签: haskell lens state-monad

在尝试了解State monad并使用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

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

2 个答案:

答案 0 :(得分:2)

镜头调用此无操作镜像simple。请注意,simpleEqualityEquality位于光学层次结构的最底部,这意味着您不仅可以将其用作无操作设置器,还可以用作无所事事的镜头,棱镜等。

  

我担心我可能会遗漏某些法律或其他假设。

制定者法律规定,对于foo制定者,over foo应遵循仿函数法律:

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

如果您使用simple / id进行尝试,您会发现法律保持平凡。其他光学法也是如此。

答案 1 :(得分:1)

是的,($),也称为id,也是镜头包装中的镜头。虽然我们getputmodify同样有效,但身份镜头有时仍然有用。