2015-12-12 21 views
15

कारण है कि मैं GHCi में यह मिल गयामुसीबत अनुक्रम के प्रकार को समझने [, बस बस]

:t sequence [Just,Just] 
sequence [Just, Just] :: a -> [Maybe a] 

विस्तार करने के लिए मैं करने के लिए के रूप में उलझन में हूँ, मैं sequence [Just 1, Just 2] :: Num a => Maybe [a] समझ सकते हैं क्योंकि जब अनुक्रम

के प्रकार को देख
sequence :: (Monad m, Traversable t) => t (m a) -> m (t a) 

यह स्पष्ट है कि यह फ़ंक्शन monadic मानों का संग्रह लेता है और संग्रह का एक एकल monadic मान देता है। इस प्रकार, जब हम sequence [Just 1, Just 2] पर कॉल करते हैं तो हमें [1,2] का Just वापस प्राप्त करना चाहिए। विचारों की उस ट्रेन के बाद, sequence [Just, Just] एक Just वापस नहीं करना चाहिए?

धन्यवाद।

उत्तर

22

दूसरा sequence एक अलग मोनड में काम करता है।

पहले के लिए:

sequence [Just 1, Just 2] 

हम चाहते हैं कि Just 1 :: Maybe a और इस Maybe इकाई में एक मूल्य है। संक्षेप में, प्रकार [Maybe a] अनुक्रम द्वारा आवश्यक t (m b) के खिलाफ मेल खाता है, और हमें t ~ [], m ~ Maybe, b ~ a - इसलिए Maybe मोनड मिलता है।

दूसरे के लिए:

sequence [Just, Just] 

हम चाहते हैं कि Just :: a -> Maybe a है। यह किस मोनड में है? अब प्रकार [a -> Maybe a]t (m b) के खिलाफ मिलान किया जाता है, और हम t ~ [], m ~ (->) a, b ~ Maybe a मिल - इसलिए हम अब Maybe एक में (->) a इकाई में काम कर रहे हैं, और अब।

इस (->) a मोनैड में, जो Reader a मोनैड के लिए आइसोमोर्फिक है, हमारे पास उदा।

sequence [f, g, h] = \x -> [f x, g x, h x] 

दरअसल, (->) a इकाई के साथ एक गणना एक अभिकलन "प्रकार a का एक अंतर्निहित तर्क समझ 'है। sequence फ़ंक्शन बस ऐसी गणनाओं की एक सूची बदलता है ([(->) a b], यानी [a -> b]) एक ही गणना में जो केवल एक बार निहित तर्क पढ़ता है, और सभी परिणामों ((->) a [b], यानी a -> [b]) के साथ एक सूची तैयार करता है।

+0

अच्छा! धन्यवाद! –

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