आप इस फ़ंक्शन को टुकड़ों से इकट्ठा कर सकते हैं जो या तो मानक हैं या होना चाहिए। स्वीकृत उत्तर में ज़िप्पर के बारे में सही संकेत है। मेरा उत्तर about differentiation and comonads प्रासंगिक संचालन का सामान्य उपचार देता है, लेकिन मुझे यहां विशिष्ट होने दें।
मैं इस प्रकार "एक तत्व छेद के साथ सूची" के प्रकार को परिभाषित:
data Bwd x = B0 | Bwd x :< x deriving Show
type HoleyList x = (Bwd x, [x])
सच पूछिये तो, मुझे लगता है कि ऐसा करने के लिए पिछड़े सूचियों को पेश करने की जरूरत नहीं है, लेकिन मैं अगर मैं इतनी आसानी से भ्रमित हो मेरे सिर में चीजों को उलटना है। (ऐसा होता है कि HoleyList
[]
का औपचारिक व्युत्पन्न है।)
अब मैं परिभाषित कर सकता हूं कि इसके संदर्भ में सूची तत्व क्या है।
type InContext x = (HoleyList x, x)
विचार है कि इस जोड़ी के दूसरे घटक पिछड़े सूची और आगे सूची के बीच में संबंध रखता है। मैं समारोह जो वापस एक साथ सूची प्लग परिभाषित कर सकते हैं (सामान्य उपचार में upF
कहा जाता है।)
plug :: InContext x -> [x]
plug ((B0, xs), y) = y : xs
plug ((xz :< x, xs), y) = plug ((xz, y : xs), x)
मैं भी समारोह है कि एक सूची के अलावा लेने के लिए सभी तरीके देता है (downF
, सामान्य रूप से) को परिभाषित कर सकते हैं।
selections :: [x] -> [InContext x]
selections = go B0 where
go xz [] = []
go xz (x : xs) = ((xz, xs), x) : go (xz :< x) xs
ध्यान दें कि
map snd (selections xs) = xs
map plug (selections xs) = map (const xs) xs
और अब हम Bartek का नुस्खा का पालन करने के लिए तैयार हैं।
selectModify :: (a -> Bool) -> (a -> a) -> [a] -> [[a]]
selectModify p f = map (plug . (id *** f)) . filter (p . snd) . selections
यह है: परीक्षण द्वारा चयन को फ़िल्टर करें, फोकस में तत्व को फ़ंक्शन लागू करें, फिर एक साथ प्लग करें। यदि आपके पास जिपर उपकरण के बारे में झूठ बोलना है, तो यह एक लाइनर है, और इसे किसी भी अलग-अलग मज़ेदार के लिए काम करना चाहिए, सिर्फ सूचियों के लिए नहीं! काम हो गया!
> selectModify ((1 ==) . (`mod` 2)) (2*) [1..10]
[[2,2,3,4,5,6,7,8,9,10]
,[1,2,6,4,5,6,7,8,9,10]
,[1,2,3,4,10,6,7,8,9,10]
,[1,2,3,4,5,6,14,8,9,10]
,[1,2,3,4,5,6,7,8,18,10]]
उंगली क्या है? – aochagavia
एक ट्रैवर्सिंग लेंस को उंगली के रूप में भी देखा जा सकता है। –
अंतिम 'ज़िप' सुझाव अनिवार्य रूप से मुहावरे है जिसे मैं इसे जल्दी से लिखने के लिए उपयोग करता था, लेकिन मैं सिर्फ एक नोट जोड़ूंगा कि आपको 'init $' भाग की आवश्यकता नहीं है - अंतिम जोड़ी स्वचालित रूप से फ़िल्टर हो जाती है '(ए, (एक्स: बी)) 'पैटर्न। –