我目前的代码如下:
do
x <- use foo
foo <~ runFoo x
其中foo
是Lens
到Foo
字段,runFoo :: MonadState m => Foo -> m Foo
我认为应该有一种方法可以在一行中执行此操作,但我找不到它。我认为它应该有一个评论:
(????) :: MonadState s m => Lens' s a -> (a -> m a) -> m a
问题:
答案 0 :(得分:1)
lens 没有以现成的形式提供这样的组合器。如果您有一些 runFoo
函数而不是 g :: a -> a
,您将能够使用 (%=)
,即 over
的 use
是 {{1} },并简单地写成view
。但是,您想要的功能涉及在获取和设置之间交错 foo %= g
引入的 m
效果,这排除了如此简单的解决方案。
答案 1 :(得分:0)
您要查找的函数的类型签名与>>=
的类型签名非常接近,但第一个参数不同。
特别是,它看起来好像use foo :: Monad m => m Foo
和foo <~ runFoo :: Foo -> m Foo
,因此您可以直接将绑定用作use foo >>= (\x -> foo <~ runFoo x)
。可能更容易/更短的方式,但我没有完整的代码可以玩。我只说坚持使用两条线,如果它是一个足够普通的操作,那么为它定义自己的组合器。