Searching for missing State Combinator for Lens
我目前有如下代码:
1 2 3
| do
x <- use foo
foo <~ runFoo x |
其中foo是foo字段的Lens和runFoo :: 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 Foo和foo <~ runFoo :: Foo -> m Foo,因此您可以将bind直接用作use foo >>= (\\x -> foo <~ runFoo x)。可能有一种更简单/更短的方法,但是我没有完整的代码可以使用。我要说的是坚持使用两行,如果这是足够常见的操作,那么请为其定义自己的组合器。
- 实际上,您还有其他事情要做吗,而不仅仅是desugar Haskell的do表示法?此技术可用于在do语句中组合任意两行。我想合并use和(<~)。