如何将 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
,也是镜头包表示中的镜头。虽然这里我们有 get
、put
、modify
也同样有效,但身份镜头有时仍然有用。
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
试试这个,你会发现这些定律是微不足道的。其他光学定律也是如此。
在尝试理解 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
,也是镜头包表示中的镜头。虽然这里我们有 get
、put
、modify
也同样有效,但身份镜头有时仍然有用。
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
试试这个,你会发现这些定律是微不足道的。其他光学定律也是如此。