2016-10-12 28 views
5

के लिए monoid की जरूरत नहीं मैं <<%~ की तरह एक समारोह जो ^? के लिए इसी तरह फैशन में Traversal रों के साथ काम करते हैं, इस तरह की जरूरत है:एनालॉग के `<<% ~` Traversal

(<<?%~) :: Traversal s t a b -> (a -> b) -> s -> (Maybe a, t) 

> ix 0 <<?%~ succ $ [1,2] 
(Just 1,[2,2]) 
> ix 1 <<?%~ succ $ [1,2] 
(Just 2,[1,3]) 
> ix 2 <<?%~ succ $ [1,2] 
(Nothing,[1,2]) 

मैं इसे कैसे लागू करना चाहिए? स्पष्ट तरीका ^? और %~ अलग से लागू करना है, लेकिन मुझे एक बार में एक समाधान चाहिए।

उत्तर

4

यदि हम लक्ष्य पर Monoid बाधा की आवश्यकता नहीं चाहते हैं, तो हमें अपने आप को Monoid निर्दिष्ट करना होगा जिसका उपयोग पुराने तत्वों को ट्रैवर्सल में संयोजित करने के लिए किया जाएगा। चूंकि लक्ष्य ^? के अनुरूप कुछ है, उपयुक्त मोनोइड First है।

(<<?%~) :: LensLike ((,) (First a)) s t a b -> (a -> b) -> s -> (Maybe a, t) 
l <<?%~ f = first getFirst . (l $ \a -> (First (Just a), f a)) 
+3

मैंने आपके समाधान के चारों ओर फ़्रेमिंग को बदले में बदल दिया। यदि आप उन्हें पसंद नहीं करते हैं तो परिवर्तनों को वापस करने के लिए स्वतंत्र महसूस करें। – duplode

+0

@duplode धन्यवाद। दुखद मैं जवाब को ऊपर नहीं उठा सकता :) – modular

संबंधित मुद्दे