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

时间:2013-09-03 04:34:41

标签: haskell state-monad lenses lens

我目前的代码如下:

do
  x <- use foo
  foo <~ runFoo x

其中fooLensFoo字段,runFoo :: MonadState m => Foo -> m Foo

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

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

问题:

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

2 个答案:

答案 0 :(得分:1)

lens 没有以现成的形式提供这样的组合器。如果您有一些 runFoo 函数而不是 g :: a -> a,您将能够使用 (%=),即 overuse 是 {{1} },并简单地写成view。但是,您想要的功能涉及在获取和设置之间交错 foo %= g 引入的 m 效果,这排除了如此简单的解决方案。

答案 1 :(得分:0)

您要查找的函数的类型签名与>>=的类型签名非常接近,但第一个参数不同。

特别是,它看起来好像use foo :: Monad m => m Foofoo <~ runFoo :: Foo -> m Foo,因此您可以直接将绑定用作use foo >>= (\x -> foo <~ runFoo x)。可能更容易/更短的方式,但我没有完整的代码可以玩。我只说坚持使用两条线,如果它是一个足够普通的操作,那么为它定义自己的组合器。