2012-01-06 11 views
15

मुझे लगता है कि मैं समझता हूं कि कैसे आवेदक फ़ैक्टर हास्केल में काम करते हैं और मैं उन्हें मूल डेटाटाइप (शायद, या तो ...) के लिए उपयोग कर रहा हूं।साझा पैरामीटर पास करने के लिए कौन सा आवेदक फंक्टर का उपयोग किया जाता है?

withPool pool = bracket (takeConn pool) (putConn pool) 

अनुप्रयोगी शैली में लिखा जा सकता है: हालांकि, मैं निम्नलिखित उदाहरण के साथ this question पाया

withPool = bracket <$> takeConn <*> putConn 

मैं इसे संकलित हैरान था और वास्तव में यह उम्मीद काम करता है के रूप में है, लेकिन किसी ने मुझसे जो अनुप्रयोगी बता सकते हैं इस के लिए फंक्टर का उपयोग किया जाता है और इसे कैसे परिभाषित किया जाता है?

अद्यतन: मुझे लगता है कि मुझे पता चला कि यह कैसे काम करता है, लेकिन मुझे नहीं पता कि यह कहां परिभाषित किया गया है।

उत्तर

17

यूनिफाई f = प्रकार हस्ताक्षर में (a ->):

fmap :: (b -> c) -> (a -> b) -> (a -> c) 
pure :: b -> (a -> b) 
(<*>) :: (a -> b -> c) -> (a -> b) -> (a -> c) 

एकमात्र कारण घोषणाओं वाक्य रचना अलग हैं, ((->) a) बनाम (a ->), कि तुम प्रकार के स्तर पर वर्गों लेने की अनुमति नहीं कर रहे हैं। तो अगर आप इन के साथ खत्म, का पीछा करते हुए प्रकार के बाद:

instance Functor ((->) a) where 
    fmap = (.) 

instance Applicative ((->) a) where 
    pure = const 
    f <*> g = \x -> f x $ g x 

मैं यकीन है कि Functor उदाहरण Data.Functor में है हूँ, और Applicative उदाहरण Control.Applicative में है। ((->) a) के लिए उदाहरण Control.Monad.Instances में Control.Monad के बजाय, एक अजीब स्थान में केवल एक ही है। कम से कम अगर मुझे सही याद है।

+9

इसके लायक होने के लिए, वास्तव में पाठक मोनैड, एक 'न्यूटाइप' रैपर से कम - यहां "साझा पैरामीटर" 'रीडर 'के लिए" पर्यावरण "जैसा ही है। इसी तरह, 'या तो त्रुटि' त्रुटि मोनड है और '(,) w' लेखक है। –

+0

@ सीए.एमसीकैन यह इंगित करने लायक है, और मैं भूल गया। इसे जोड़ने के लिए धन्यवाद। – Carl

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

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