2012-08-13 18 views
5

विभिन्न हस्ताक्षरों के साथ कार्यों का आंशिक अनुप्रयोग क्यों काम करता है?आंशिक आवेदन की व्याख्या -

एक उदाहरण के रूप Control.Monad.join लें:

GHCi> :t (=<<) 
(=<<) :: Monad m => (a -> m b) -> m a -> m b 
GHCi> :t id 
id :: a -> a 
GHCi> :t (=<<) id 
(=<<) id :: Monad m => m (m b) -> m b 

क्यों वे स्पष्ट रूप से अलग हैं, यह स्वीकार करता है (a -> m b) तर्क के स्थान पर id :: a -> a करता है?

उत्तर

10

=<< का प्रकार हस्ताक्षर कहता है कि पहला तर्क a (कुछ भी) से b के एक मोनैड में एक फ़ंक्शन है।

अच्छा, m b कुछ भी के रूप में गिना जाता है, है ना? तो हम बस हर a के लिए m b में स्थानापन्न कर सकते हैं:

(=<<) :: Monad m => (m b -> m b) -> m (m b) -> m b 

id रों प्रकार का कहना है कि यह एक ही कुछ भी करने के लिए कुछ भी से एक समारोह है। तो अगर हम m b में उप (इकाई बाधा भूल नहीं), हम पाते हैं:

id :: Monad m => m b -> m b 

तो फिर तुम कि प्रकार के मैच देख सकते हैं।

+0

यह सरल और सीधा लगता है, धन्यवाद। क्या = << आईडी का अंतिम हस्ताक्षर किसी भी तरह से रिटर्न वैल्यू से अनुमानित फ़ंक्शन तर्कों से मेल खाता है? –

+0

@ डेविड हाँ, मुझे विश्वास है कि यह मूल रूप से सही है। –

2

यह m b साथ a को एकजुट करने की कोशिश करता है, और बस फैसला करता है कि am b होना चाहिए, इसलिए के प्रकार (धारणा a ~ m b के तहत) Monad m => (mb -> m b) -> m (m b) -> m b है, और एक बार आप इसे id पर लागू होते हैं, तो आप Monad m => m (m b) -> m b साथ छोड़ दिया जाता है।

3

कुछ उपयोगी अवधारणाओं यहाँ उपयोग करने के लिए:

  1. किसी भी प्रकार की एक चर a साथ किसी भी अन्य प्रकार t साथ a के प्रत्येक उदाहरण के स्थान पर एक अलग प्रकार में परिवर्तित किया जा सकता है। तो यदि आपके पास a -> b -> c टाइप है, तो आप टाइप bd या c क्रमश: Int के साथ को बदलकर टाइप कर सकते हैं।
  2. किसी भी दो प्रकार को प्रतिस्थापन द्वारा एक-दूसरे में परिवर्तित किया जा सकता है। उदाहरण के लिए, a -> b और c -> d बराबर हैं (a ~ c, b ~ d)।
  3. एक प्रकार t एक प्रकार t' में बदला जा सकता है, लेकिन t't करने के लिए वापस नहीं बदला जा सकता है, तो हम कहते हैं कि t' एक विशेषज्ञता t की है। उदाहरण के लिए, a -> aa -> b का एक विशेषज्ञ है।

अब, इन बहुत उपयोगी अवधारणाओं के साथ, आपके प्रश्न का उत्तर बहुत आसान है: भले ही फ़ंक्शन के "मूल" प्रकार बिल्कुल मेल नहीं खाते हैं, फिर भी वे संगत हैं क्योंकि उन्हें फिर से लिखा जा सकता है या इसे प्राप्त करने के लिए विशिष्ट किया जा सकता है सटीक मिलान। मैट फेनविक का जवाब विशेषज्ञताओं को दिखाता है जो इस मामले के लिए करते हैं।

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