在尝试了解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
这确实是镜头进入状态变量的正确定义吗?我担心我可能会遗漏一些法律或其他假设。
答案 0 :(得分:2)
镜头调用此无操作镜像simple
。请注意,simple
是Equality
,Equality
位于光学层次结构的最底部,这意味着您不仅可以将其用作无操作设置器,还可以用作无所事事的镜头,棱镜等。
我担心我可能会遗漏某些法律或其他假设。
制定者法律规定,对于foo
制定者,over foo
应遵循仿函数法律:
over foo id = id
over foo (g . f) = over foo g . over foo f
如果您使用simple
/ id
进行尝试,您会发现法律保持平凡。其他光学法也是如此。
答案 1 :(得分:1)
是的,($)
,也称为id
,也是镜头包装中的镜头。虽然我们get
,put
,modify
同样有效,但身份镜头有时仍然有用。