关于haskell:搜索缺少的Lens State Combinator

Searching for missing State Combinator for Lens

我目前有如下代码:

1
2
3
do
  x <- use foo
  foo <~ runFoo x

其中foofoo字段的LensrunFoo :: MonadState m => Foo -> m Foo

我认为应该有一种方法可以一次完成此操作,但是我找不到它。我认为应该有这样的评论:

1
(????) :: MonadState s m => Lens' s a -> (a -> m a) -> m a

问题:

  • 是否存在这样的组合器?如果是这样,那是什么?
  • 当我遇到另一个类似的问题时,搜索它的最佳方法是什么(即通常我只是将其输入到Hoogle中,但我并没有很幸运地使用镜头库进行此操作)
  • 这实际上是在Control.Monad中找到的原始组合器吗? (如果这是kleisli箭头的另一项工作,我会有些尴尬)

lens不提供这种现成形式的组合器。如果您使用的是g :: a -> a函数而不是runFoo,则可以使用(%=)(对于over而言,对于use对于view),并简单地编写foo %= g。但是,您需要的功能包括在获取和设置之间插入由runFoo引入的m效果,这使解决方案变得不那么简单。


您正在寻找的函数的类型签名可疑地接近于>>=的类型签名,但是第一个参数不同。

尤其是它看起来像use foo :: Monad m => m Foofoo <~ runFoo :: Foo -> m Foo,因此您可以将bind直接用作use foo >>= (\\x -> foo <~ runFoo x)。可能有一种更简单/更短的方法,但是我没有完整的代码可以使用。我要说的是坚持使用两行,如果这是足够常见的操作,那么请为其定义自己的组合器。