gpt4 book ai didi

haskell - .~ 的 Monadic 版本(Haskell)

转载 作者:行者123 更新时间:2023-12-01 12:39:13 25 4
gpt4 key购买 nike

我正在寻找 .~ 的一个版本,它接受一个包装在 Monad 中的值并返回一个 Monad。例如:

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

假设 .~~ 会:

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

虽然不难定义,但它是否已经在 Lens 包中的某处定义了?

最佳答案

我不知道像那样的单个运算符(operator),但通过一些“微小”调整,这基本上就是镜头的原始应用程序所做的。调整是:

  • 您使用修改函数而不仅仅是设置值。
  • 您的Monad 需要是一个Functor,几乎所有的都是。 (从 GHC 7.10 开始这将是强制性的,但在 7.8 中还不是。)

所以你可以这样做:

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)]

甚至可以与 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 中,则 like) 可以定义为 just

Prelude Control.Lens> let (.~~) = (. const)
Prelude Control.Lens> (0,1) & _1 .~~ return 100 :: Either () (Int,Int)
Right (100,1)

关于haskell - .~ 的 Monadic 版本(Haskell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26587671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com