यदि आप अपनी कुंजी के रूप में सूची के प्रत्येक तत्व की (अंतर्निहित) इंडेक्स पर विचार करते हैं, तो zipWith
एक संबंधपरक आंतरिक शामिल होने जैसा है। यह केवल कुंजी प्रक्रियाओं दोनों आदानों जिसके लिए मान हैं:कैनोनिकल बाहरी ज़िप कार्य में शामिल हों
zipWith (+) [1..5] [10..20] == zipWith (+) [1..11] [10..14] == [11,13,15,17,19]
वहाँ एक विहित इसी समारोह में शामिल होने के बाहरी करने के लिए इसी है? कुछ की तरह:
outerZipWith :: (a -> b -> c) -> a -> b -> [a] -> [b] -> [c]
outerZipWith _ _ _ [] [] = []
outerZipWith f a' b' [] (b:bs) = f a' b : outerZipWith f a' b' [] bs
outerZipWith f a' b' (a:as) [] = f a b' : outerZipWith f a' b' as []
outerZipWith f a' b' (a:as) (b:bs) = f a b : outerZipWith f a' b' as bs
या शायद
outerZipWith' :: (a -> b -> c) -> Maybe a -> Maybe b -> [a] -> [b] -> [c]
outerZipWith' _ _ _ [] [] = []
outerZipWith' _ Nothing _ [] _ = []
outerZipWith' _ _ Nothing _ [] = []
outerZipWith' f a' b' [] (b:bs) = f (fromJust a') b : outerZipWith f a' b' [] bs
outerZipWith' f a' b' (a:as) [] = f a (fromJust b') : outerZipWith f a' b' as []
outerZipWith' f a' b' (a:as) (b:bs) = f a b : outerZipWith f a' b' as bs
तो मैं
outerZipWith (+) 0 0 [1..5] [10..20] == [11,13,15,17,19,15,16,17,18,19,20]
outerZipWith (+) 0 0 [1..11] [10..14] == [11,13,15,17,19,6,7,8,9,10,11]
कर सकते हैं मैं अपने आप को समय-समय पर यह आवश्यकता होगी, मिल जाए, और मैं नहीं बल्कि एक आम मुहावरा प्रयोग करेंगे outerZipWith
को लागू करने के बजाय, या if length as < length bs then zipWith f (as ++ repeat a) bs else zipWith f as (bs ++ repeat b)
को लागू करने के बजाय मेरे कोड को अधिक लिखने योग्य (और बनाए रखने में आसान) बनाएं।
'बाहरी ज़िप्प :: ए -> बी -> [ए] -> [बी] -> [(ए, बी)] '? – pat
'outerZip :: (a -> c) -> (बी -> डी) -> सी -> डी -> [ए] -> [बी] -> [(सी, डी)]' – Apocalisp
एक समावेशी -या प्रकार (जैसे आपका 'इन') आवश्यक पहला कदम हो सकता है। कम से कम, यह शुरू करने के लिए एक अच्छी जगह है। – rampion