我是新手Control.Lens
,我正在尝试将 2 个镜头“平行”(而不是按顺序)组合,就像我对 `Control.Arrow.&&& 所做的那样。
如果我从lens
文档中获取示例:
`data Foo a = Foo { _baz :: Int, _bar :: Int, a }
我希望能够做类似的事情:
>> let foo = (bar &&& baz) .~ (1, 20) $ Foo undefined undefined "FOO"
>> foo ^. (bar &&& baz)
(1, 20)
我到处寻找,我找不到这样做的方法。那是因为:
- (&&&) 以另一个名字存在,我错过了。
- 没用的。我不应该需要它,因此没有人打扰实现它。
both
以另一种方式(使用or<*>
)做起来很简单
更新
&&&
可以这样实现:
(/|\) :: Lens' f a -> Lens' f b -> Lens' f (a, b)
a /|\ b = lens getBoth setBoth where
getBoth f = (f ^. a, f ^. b)
setBoth f (v, w) = a .~ v $ f' where
f' = b .~ w $ f
barz :: Lens' Foo (Int, Int)
barz = bar /|\ baz
但是,它需要一个有点烦人的类型签名。