我正在寻找.~
的版本,该版本采用Monad包含的值并返回Monad。例如:
(0, 1) & _1 .~ 100 = (100,1)
假设.~~
会:
(0, 1) & _1 .~~ return 100 = return (100,1)
虽然定义起来并不难,但它是否已在Lens包中的某处定义过?
答案 0 :(得分:4)
我不知道一个单个运算符就是这样,但是对于一些" tiny"调整,这基本上是镜头的原始应用程序。调整是:
Monad
必须是Functor
,几乎所有人都是Prelude Control.Lens> (0,1) & _1 (const (Just 100))
Just (100,1)
Prelude Control.Lens> (0,1) & _1 (const [100])
[(100,1)]
Prelude Control.Lens> (0,1) & _1 (const [100,200])
[(100,1),(200,1)]
。 (这将是GHC 7.10的强制性要求,但在7.8中还没有。)所以你可以这样做:
Traversals
甚至适用于Prelude Control.Lens> (0,1) & both (const [100,200])
[(100,100),(100,200),(200,100),(200,200)]
:
%%~
如果您仍然需要运营商,则id
运算符已定义,但它本质上是Prelude Control.Lens> (0,1) & _1 %%~ const (return 100) :: Either () (Int,Int)
Right (100,1)
的类型限制同义词:
.~~
最后,虽然确实表示它很简单,但我的.%~
运算符(我认为逻辑上可能是lens
或类似情况,如果它实际上在{{1} }})可以定义为
Prelude Control.Lens> let (.~~) = (. const)
Prelude Control.Lens> (0,1) & _1 .~~ return 100 :: Either () (Int,Int)
Right (100,1)