2010-10-13 11 views
64

किस स्थिति में liftIO उपयोग किया जाना चाहिए? जब मैं ErrorT String IO का उपयोग कर रहा हूं, lift फ़ंक्शन IO क्रियाओं को ErrorT में उठाने के लिए काम करता है, इसलिए liftIO अनिवार्य लगता है।हास्केल: लिफ्ट बनाम लिफ्टियो

उत्तर

75

lift हमेशा "पिछली" परत से लिफ्ट करता है। यदि आपको दूसरी परत से उठने की आवश्यकता है, तो आपको lift . lift और इसी तरह की आवश्यकता होगी।

दूसरी ओर, liftIO हमेशा आईओ परत से निकलता है (जो, जब मौजूद होता है, हमेशा ढेर के नीचे होता है)। इसलिए, यदि आपके पास मोनैड की 2 से अधिक परतें हैं, तो आप liftIO की सराहना करेंगे।

तर्क के प्रकार की तुलना करें निम्नलिखित lambdas में:।

type T = ReaderT Int (WriterT String IO) Bool 

> :t \x -> (lift x :: T) 
\x -> (lift x :: T) :: WriterT String IO Bool -> T 

> :t \x -> (liftIO x :: T) 
\x -> (liftIO x :: T) :: IO Bool -> T 
+26

मैं आमतौर पर 'लिफ्ट' पर्याप्त रूप से आईओ परत को उठाने के लिए उपयोग करता हूं, भले ही 'लिफ्ट' पर्याप्त हो, क्योंकि तब मैं मोनैड स्टैक बदल सकता हूं और कोड अभी भी काम करता है। –

+11

@ जॉन: अच्छा बिंदु। और यह भी स्पष्ट करता है कि आप आईओ उठा रहे हैं और कोई अन्य मोनड नहीं। –

28

liftIO आईओ इकाई, जो भी इकाई आप में हैं करने के लिए सिर्फ एक शॉर्टकट है असल में, liftIO लिफ्टों के परिवर्तनशील का उपयोग करने के बराबर होती है । सबसे पहले यह अनावश्यक लग सकता है लेकिन लिफ्टियो का उपयोग करना एक बड़ा फायदा है: यह आपके आईओ कोड को वास्तविक मोनाड निर्माण का अनुपालन करता है ताकि आप उसी कोड का पुन: उपयोग कर सकें, चाहे आपका अंतिम मोनाड बनाया गया हो, यह काफी महत्वपूर्ण है (यह काफी महत्वपूर्ण है एक मोनड ट्रांसफार्मर लिखते समय)।

ओहटर हाथ पर, लिफ्टियो मुफ्त में नहीं आ रहा है, क्योंकि लिफ्ट करता है: आपके द्वारा उपयोग किए जा रहे मोनाड ट्रांसफार्मर के लिए इसका समर्थन होना चाहिए, उदा। जिस मोनैड में आप हैं, वह मोनाडियो क्लास का एक उदाहरण होना चाहिए, लेकिन ज्यादातर मोनाड आजकल करते हैं (और निश्चित रूप से, टाइप-चेकर आपके लिए संकलन समय पर यह जांच करेगा: यह हैस्केल की ताकत है!)।

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