2015-11-06 7 views
11

कल रात, मैं कुछ मनोरंजक कोड लिख रहा था, और किसी बिंदु पर मैंने concatMap को >>= के साथ बदल दिया और मेरे कोड में ~ 10% की गति देखी।>> = concatMap से तेज़ क्यों है जब उन्हें एक ही चीज़ होना चाहिए?

मैं >>= की परिभाषा के तहत [] के लिए concatMap था, इसलिए मैं थोड़ा उलझन में हूं।

उत्तर

8

आधार 4.8 (>>=) में (here देखें) कार्यान्वित किया जाता है के रूप में:

xs >>= f = [y | x <- xs, y <- f x] 

और concatMap एक और अधिक जटिल बिल्डर (स्रोत here)

concatMap :: Foldable t => (a -> [b]) -> t a -> [b] 
concatMap f xs = build (\c n -> foldr (\x b -> foldr c b (f x)) n xs) 
+1

दिलचस्प उपयोग कर रहा है। मैं मदद नहीं कर सकता लेकिन सोच सकता हूं कि 'फोल्डबल' जो 'वैकल्पिक' भी है 'मोनाड' के बराबर है .... – AJFarmar

+0

@AJFarmar आप ऐसा क्यों सोचेंगे? मुझे नहीं पता कि यह कैसे समझता है – Emil

+0

@ user3217013 'बाइंड 'एफए एफ = फ़ोल्डर (<|>) खाली $ फ़ोल्डर (:) [] (एफएमएपी एफ एफए)' जहां 'बाइंड' :: (फोल्ड करने योग्य एफ, आवेदक एफ) => एफए -> (ए -> एफबी) -> एफबी'। QED। – AJFarmar

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