2014-07-20 8 views
5

हास्केल कैसे जानता है कि प्रत्येक return अभिव्यक्ति के लिए सही मोनैड उदाहरण कौन सा है?होस्केल हो सकता है कि हो सकता है कि होस्टिंग कार्यान्वयन में सही प्रकार की कक्षाएं कैसे हों?

newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) } 

instance Monad m => Monad (MaybeT m) where 
    return = MaybeT . return . return 

उत्तर

4

यह वास्तव में संदर्भ से स्पष्ट है।

के typechecker खेलते हैं,

-- From the signature 
MaybeT . return . return :: a -> MaybeT a 
-- From the type of MaybeT 
return . return :: a -> m (Maybe a) 
-- From the type of `.` 
(return :: Maybe a -> m a) . (return :: a -> Maybe a) 

और एक बार हम एक return के प्रकार है, "उदाहरण के चयन एल्गोरिथ्म" सही ढंग से m रों return उपयोग करने के लिए पहले का चयन करेंगे और दूसरे Maybe किया जाना है।

+0

अंतिम पंक्ति पर पहली बार वापसी नहीं होनी चाहिए 'शायद ए -> एम (शायद ए)' या अधिक सामान्य 'बी -> एम बी' 'बी ~ हो सकता है' के साथ? – Laar

+0

@ लायर तकनीकी रूप से हां, लेकिन यह इस तरह से इलाज करने के लिए आसान (और नैतिक रूप से समकक्ष) है। – jozefg

4

यह आवश्यक प्रकारों का अनुमान लगाता है।

यह एक instance परिभाषा का अर्थ है कि हम

returnMaybeT :: Monad m => a -> MaybeT m a 
returnMaybeT x = MaybeT (return (return x)) 

परिभाषित करने के लिए MaybeT :: m (Maybe a) -> MaybeT a (एक समारोह के रूप में लिया) हम जानते हैं कि return रों के भीतरी ढेर होना आवश्यक है के बाद से कोशिश कर रहे हैं से स्पष्ट है प्रकार

return (return x) :: Monad m => a -> m (Maybe a) 

अब, हम जानते हैं कि return एक बहुरूपी समारोह जो

की तरह एक प्रकार है 10

के लिएMonadn। इस पहले return के मामले में, Monad m => बाधा हमें बताती है कि mMonad है और इसलिए हम इसकी वापसी की परिभाषा का उपयोग कर सकते हैं। यह हमारे भीतर की return

return x :: a -> Maybe a 

करने के लिए नीचे सभी तरह से प्राप्त करने देता है और जब से हम जानते हैं Maybe एक Monad उदाहरण है कि हम उस से return उपयोग कर सकते हैं।


अंत में, सभी संकलक करना है छीलना अभिव्यक्ति प्रकार प्रत्येक return पर की जरूरत निर्धारित करने के लिए कोशिश कर नीचे अपना रास्ता है। यह आवश्यक प्रकार निर्धारित करने के बाद इसे जांचना होगा कि क्या यह उस प्रकार के Monad उदाहरण को जानता है। Maybe के लिए यह आसान है, क्योंकि यह ठोस है, लेकिन m के लिए थोड़ा और मुश्किल देखना है क्योंकि यह केवल एक चर है।

कारण m काम करता है क्योंकि हम चर विवश कर दिया है निश्चित रूप से कुछ प्रकार है जो Monad को दर्शाता हो रहा है।

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