gpt4 book ai didi

haskell - 组合镜头

转载 作者:行者123 更新时间:2023-12-03 20:09:46 25 4
gpt4 key购买 nike

使用 镜头 库我可以将修改功能应用于单个目标,如下所示:

Prelude Control.Lens> (1, 'a', 2) & _1 %~ (*3)
(3,'a',2)
Prelude Control.Lens> (1, 'a', 2) & _3 %~ (*3)
(1,'a',6)

如何组合这些单独的镜头( _1_3 )以便能够同时对两个目标执行此更新?我期望本着以下精神:
Prelude Control.Lens> (1, 'a', 2) & ??? %~ (*3)
(3,'a',6)

最佳答案

使用 untainted来自 SettableControl.Lens.Internal.Setter 中键入类,可以组合两个 setter,但结果也只会是 setter 而不是 getter。

import Control.Lens.Internal.Setter

-- (&&&) is already taken by Control.Arrow
(~&~) :: (Settable f) => (c -> d -> f a) -> (c -> a -> t) -> c -> d -> t
(~&~) a b f = b f . untainted . a f

您可以对此进行测试:
>>> import Control.Lens
>>> (1, 'a', 2) & (_1 ~&~ _3) %~ (*3)
(3,'a',6)

编辑

您实际上不需要使用内部函数。您可以使用 Mutator 是一个 monad 的事实:
{-# LANGUAGE NoMonomorphismRestriction #-}

import Control.Monad
import Control.Applicative

(~&~) = liftA2 (>=>)

-- This works too, and is maybe easier to understand:
(~&~) a b f x = a f x >>= b f

关于haskell - 组合镜头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17528119/

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