मैं मोनड ट्रांसफार्मर सीख रहा हूं और लिफ्ट का उपयोग करते समय मैं उलझन में हूं। मान लें कि मेरे पास निम्न कोड है (यह कुछ भी दिलचस्प नहीं कर रहा है, केवल इतना आसान है कि मैं प्रदर्शन के लिए आ सकता हूं)।जब मोनाड ट्रांसफार्मर में वास्तव में जरूरी उठाना आवश्यक है?
foo :: Int -> State Int Int
foo x = do
(`runContT` pure) $ do
callCC $ \exit -> do
when (odd x) $ do
-- lift unnecessary
a <- get
put $ 2*a
when (x >= 5) $ do
-- lift unnecessary, but there is exit
a <- get
exit a
when (x < 0) $ do
-- lift necessary
a <- lift $ foo (x + 10)
lift $ put a
lift get
तो वहाँ एक इकाई ढेर, जहां मुख्य करते ब्लॉक टाइप ContT Int (StateT Int Identity) Int
है।
अब, तीसरे when
में रिकर्सन के साथ ब्लॉक करें प्रोग्राम को संकलित करने के लिए एक लिफ्ट की आवश्यकता है। दूसरे ब्लॉक में, कोई लिफ्ट की आवश्यकता नहीं है, लेकिन मुझे लगता है कि यह exit
की उपस्थिति के कारण है, जो किसी भी तरह से ऊपर की रेखा को ContT
पर ले जाने के लिए मजबूर करता है। लेकिन पहले ब्लॉक में, कोई लिफ्ट की आवश्यकता नहीं है। (लेकिन अगर यह स्पष्ट रूप से जोड़ा गया है, तो कोई समस्या नहीं है।) यह वास्तव में मुझे भ्रमित कर रहा है। मुझे लगता है कि सभी when
ब्लॉक बराबर हैं और या तो लिफ्ट को हर जगह या कहीं भी आवश्यक नहीं होना चाहिए। लेकिन यह स्पष्ट रूप से सच नहीं है। लिफ्ट को आवश्यक/आवश्यक नहीं होने वाला महत्वपूर्ण अंतर कहां है?