लेंस उस के लिए तैयार किए गए संयोजक नहीं है, संभवतः बीक्यूज आप अवैध सेटर्स (या लेंस) प्राप्त कर सकते हैं यदि घटकों का ध्यान ओवरलैप हो।
data Trio a = Trio a a a
deriving (Show)
oneTwo :: Setter' (Trio a) (a, a)
oneTwo = sets $ \f (Trio x y z) -> let (x', y') = f (x, y) in Trio x' y' z
twoThree :: Setter' (Trio a) (a, a)
twoThree = sets $ \f (Trio x y z) -> let (y', z') = f (y, z) in Trio x y' z'
cheating :: Setter' (Trio a) (a, a)
cheating = sets $ \f x -> x & oneTwo %~ f & twoThree %~ f
GHCi> Trio 1 1 1 & cheating %~ bimap (2*) (2*) & cheating %~ bimap (3+) (3+)
Trio 5 10 5
GHCi> Trio 1 1 1 & cheating %~ (bimap (2*) (2*) <&> bimap (3+) (3+))
Trio 5 13 5
आपके मामले में, (के रूप में आप and Cristoph Hegemann कर रहे हैं) हाथ से सेटर/ट्रेवर्सल के निर्माण के लिए सबसे अच्छा विकल्प के रूप में bennofs से कहीं और सुझाव दिया (लिंक के लिए धन्यवाद Shersh, liftA2 (>=>) :: ASetter' s a -> ASetter' s a -> ASetter' s a
हो रहा है)। आप (कुछ अन्य Bitraversable
या) एक सजातीय जोड़ी के लिए एक लेंस के आसपास झूठ बोल रही है करने के लिए है, तो आप both
साथ इसे से बाहर ट्रेवर्सल प्राप्त कर सकते हैं:
data Foo = Foo
{ _bar, _baz :: Int
} deriving (Show)
makeLenses ''Foo
barBaz :: Iso' Foo (Int, Int)
barBaz = iso ((,) <$> view bar <*> view baz) (Foo <$> fst <*> snd)
GHCi> Foo 1 2 & barBaz . both %~ (2*)
Foo {_bar = 2, _baz = 4}
फिर भी एक और संभावना के लिए Data.Data.Lens
का शोषण कर रहा है
{-# LANGUAGE DeriveDataTypeable #-}
import Control.Lens
import Data.Data.Lens
import Data.Data
data Foo = Foo
{ _bar, _baz :: Int
} deriving (Show, Data, Typeable)
makeLenses ''Foo
barBaz :: Traversal' Foo Int
barBaz = template
GHCi> Foo 1 2 & barBaz %~ (2*)
Foo {_bar = 2, _baz = 4}
: एक खास प्रकार के सभी क्षेत्रों का एक ट्रेवर्सल मिल
ऐसा लगता है कि यह आपके प्रश्न का उत्तर देता है: http://stackoverflow.com/questions/17528119/combining-lenses – Shersh
क्या आप 'फू' के बजाय एक टुपल का उपयोग कर रहे थे, तो आप कुछ ऐसा कर सकते थे ['(1,2) और दोनों। ~ 10'] (https://hackage.haskell.org/package/lens-4.15.1/docs/Control-Lens-Traversal.html#v:both) tuple के दोनों तत्वों को '10' पर सेट करने के लिए। – Alec