正在搜索丢失的镜头状态组合器

Joh*_*ler 5 haskell state-monad lenses haskell-lens

我目前的代码如下所示:

do
  x <- use foo
  foo <~ runFoo x
Run Code Online (Sandbox Code Playgroud)

在哪里fooLens一个Foo领域和runFoo :: MonadState m => Foo -> m Foo

我认为应该有一种方法可以在一行中执行此操作,但我找不到它.我认为它应该有一个评论:

(????) :: MonadState s m => Lens' s a -> (a -> m a) -> m a
Run Code Online (Sandbox Code Playgroud)

问题:

  • 这样的组合子存在吗?如果是这样的话是什么?
  • 当我遇到这样的另一个问题时,搜索它的最佳方法是什么(即通常我只是将其键入到Hoogle中,但我没有用镜头库做好运)
  • 这实际上是Control.Monad中的原始组合器吗?(如果这是kleisli箭头的另一项工作,我会有点尴尬)

dup*_*ode 1

Lens不提供这样的现成形式的组合器。如果runFoo你没有一些g :: a -> a函数,你就可以使用(%=),即 to over,并简单地use编写。然而,您想要的功能涉及在获取和设置之间交错引入的效果,这妨碍了如此简单的解决方案。viewfoo %= gmrunFoo