कार्यात्मक लेंस


80

क्या कोई मुझे कार्यात्मक लेंस समझा सकता है? यह Google के लिए आश्चर्यजनक रूप से कठिन विषय है और मैंने कोई प्रगति नहीं की है। मुझे पता है कि वे OO की तुलना में समान / सेट कार्यक्षमता प्रदान करते हैं।


7
YouTube पर Edward Kmett द्वारा लेंस का एक अच्छा परिचय है । उदाहरण स्काला में हैं, लेकिन इसका पालन करना बहुत कठिन नहीं होना चाहिए।
हमार

हाँ, उन लोगों को देखने की कोशिश की, लेकिन जब मैं अभी भी सतर्क हूँ, तो इतना समय देना इतना आसान नहीं है: P
Masse

2
@ जोचेन: जिन लेंसों का वर्णन किया गया है, वे वास्तव में उन लेंसों के साथ बहुत आम नहीं हैं, जिनके बारे में यह सवाल है।
sclv

3
यहाँ चित्रों का उपयोग करके अच्छा परिचय दिया गया है: लेंस इन पिक्चर्स
देबजीत

जवाबों:


61

एक लेंस में दो कार्य होते हैं, एक गेटटर और एक सेटर:

data Lens a b = Lens { getter :: a -> b, setter :: b -> a -> a }

उदाहरण के लिए, हमारे पास एक जोड़ी के पहले और दूसरे भाग के लिए लेंस हो सकते हैं:

fstLens :: Lens (a, b) a
fstLens = Lens fst $ \x (a, b) -> (x, b)

sndLens :: Lens (a, b) b
sndLens = Lens snd $ \x (a, b) -> (a, x)

लेंस की वास्तविक सुविधा यह है कि वे रचना करते हैं:

compose :: Lens b c -> Lens a b -> Lens a c
compose f g = Lens (getter f . getter g) $
                   \c a -> setter g (setter f c (getter g a)) a

और वे यंत्रवत् रूप से Stateसंक्रमण में परिवर्तित होते हैं :

lensGet :: MonadState s m => Lens s a -> m a
lensGet = gets . getter

lensSet :: MonadState s m => Lens s b -> b -> m ()
lensSet f = modify . setter f

lensMod :: MonadState s m => Lens s b -> (b -> b) -> m ()
lensMod f g = modify $ setter f =<< g . getter f

(+=) :: (MonadState s m, Num b) => Lens s b -> b -> m ()
f += x = lensMod f (+ x)

आपके कंपोज का उदाहरण टाइपकास्ट नहीं था। जीएचसी शिशुओं; लेंस आ -> लेंस आ -> लेन्स आ
मैसेज

Masse: मैं गलती से fऔर फ़्लिप किया g
Apocalisp

यह अभी भी a-> c में चेक टाइप नहीं करता है। यह रचना में लगाता है :: लेंस अब -> लेंस आ -> लेंस एबी
मस्स

13

प्रश्न लेंस, फेकैबल्स, डेटा-एक्सेसर का उत्तर देखें - संरचना की पहुंच और म्यूटेशन के लिए कौन सी लाइब्रेरी बेहतर है - इसकी लेंस पर बहुत स्पष्ट व्याख्या है।

इसके अलावा, Data.Lenses और fclabel पुस्तकालयों के लिए प्रलेखन उन्हें इस्तेमाल किए जाने के कुछ अच्छे उदाहरण देते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.