Haskell 如何使用带有镜头的一元函数进行修改?
我需要一个镜头功能,其工作原理类似于上的,但具有一元操作:Haskell 如何使用带有镜头的一元函数进行修改?,haskell,monads,haskell-lens,Haskell,Monads,Haskell Lens,我需要一个镜头功能,其工作原理类似于上的,但具有一元操作: overM :: (Monad m) => Lens s t a b -> (a -> m b) -> (s -> m t) 虽然这个函数很容易定义(它实际上只是一个身份模WrappedMonad),但我想知道这样的函数是不是在lens中的某个地方定义的 在Control.Lens.Traversal中: traverseOf :: Over p f s t a b -> p a (f b) -&g
overM :: (Monad m) => Lens s t a b -> (a -> m b) -> (s -> m t)
虽然这个函数很容易定义(它实际上只是一个身份模WrappedMonad
),但我想知道这样的函数是不是在lens中的某个地方定义的
在Control.Lens.Traversal中:
traverseOf :: Over p f s t a b -> p a (f b) -> s -> f t
traverseOf = id
mapMOf :: Profunctor p =>
Over p (WrappedMonad m) s t a b -> p a (m b) -> s -> m t
mapMOf l cmd = unwrapMonad #. l (WrapMonad #. cmd)
例如:
Prelude Control.Lens> traverseOf _1 (Just . (+2)) (2,2)
Just (4,2)
Prelude Control.Lens> mapMOf _1 (Just . (+2)) (2,2)
Just (4,2)
traverseOf
只是id
,对AMP问题没有帮助。您需要使用WrappedMonad
-固定镜头才能使用traverseOf
@J.Abrahamson感谢您的澄清,从Traversal库中添加了mapMOf
定义。
Prelude Control.Lens> traverseOf _1 (Just . (+2)) (2,2)
Just (4,2)
Prelude Control.Lens> mapMOf _1 (Just . (+2)) (2,2)
Just (4,2)