traverse
चीजों को "अंदर" चीजों Traversable
में बदल देता है , एक ऐसा कार्य दिया Traversable
जाता है Applicative
, Applicative
जो चीजों से बाहर हो जाता है।
के Maybe
रूप में उपयोग करते हैं Applicative
और के रूप में सूची Traversable
। पहले हमें परिवर्तन समारोह की आवश्यकता है:
half x = if even x then Just (x `div` 2) else Nothing
इसलिए यदि कोई संख्या सम है, तो हम उसका आधा (अंदर Just
), दूसरे को प्राप्त करते हैं Nothing
। यदि सब कुछ "अच्छी तरह से" चला जाता है, तो यह इस तरह दिखता है:
traverse half [2,4..10]
--Just [1,2,3,4,5]
परंतु...
traverse half [1..10]
-- Nothing
कारण यह है कि <*>
फ़ंक्शन का उपयोग परिणाम बनाने के लिए किया जाता है, और जब कोई तर्क होता है Nothing
, तो हम Nothing
वापस आ जाते हैं।
एक और उदाहरण:
rep x = replicate x x
यह फ़ंक्शन x
सामग्री के साथ लंबाई की एक सूची बनाता है x
, जैसे rep 3
= [3,3,3]
। का परिणाम क्या है traverse rep [1..3]
?
हमें आंशिक परिणाम मिलते हैं [1]
, [2,2]
और [3,3,3]
उपयोग करते हैं rep
। अब सूचियों का शब्दार्थ Applicatives
"सभी संयोजनों को लेना" है, उदाहरण के (+) <$> [10,20] <*> [3,4]
लिए [13,14,23,24]
।
"सभी संयोजन" [1]
और [2,2]
दो बार हैं [1,2]
। दो बार के सभी संयोजन [1,2]
और [3,3,3]
छह बार हैं [1,2,3]
। तो हमारे पास:
traverse rep [1..3]
--[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]