Monadic版本.~(Haskell)

时间:2014-10-27 12:32:15

标签: haskell lens

我正在寻找.~的版本,该版本采用Monad包含的值并返回Monad。例如:

(0, 1) & _1 .~ 100 = (100,1)

假设.~~会:

(0, 1) & _1 .~~ return 100 = return (100,1)

虽然定义起来并不难,但它是否已在Lens包中的某处定义过?

1 个答案:

答案 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)