मैं निरंतरता मोनाड ट्रांसफार्मर के मोनाडवाइटर के लिए व्युत्पन्न उदाहरण बनाने का प्रयास करता हूं।निरंतर मोनाड ट्रांसफार्मर के लिए मोनाडवाइटर के उदाहरण प्राप्त करना असंभव है?
Occurs check: cannot construct the infinite type: a = (a, w)
When generalising the type(s) for `listen'
In the instance declaration for `MonadWriter w (ContT r m)'
:
instance (MonadWriter w m) => MonadWriter w (ContT r m) where
tell= lift . tell
listen m= ContT $ \ c -> do
(a,w) <- runContT m (listen . c)
return (a,w)
pass m = undefined
इसके बाद:
Occurs check: cannot construct the infinite type: r = (r, w1)
When generalising the type(s) for `listen'
In the instance declaration for `MonadWriter w (ContT r m)'
अगला कोशिश यह थी:
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, UndecidableInstances #-}
import Control.Monad.Cont
import Control.Monad.Writer
instance (MonadWriter w m) => MonadWriter w (ContT r m) where
tell= lift . tell
listen m= ContT $ \ c -> do
(a,w) <- listen $ runContT m (c)
return (a,w)
pass m = undefined
यह मैं निम्न त्रुटि देता है: यह कैसे मैं इसे करने की कोशिश की है
क्या कोई भी kn ओउ कैसे सुनो लागू करने और यहां पास करने के लिए? क्या ऐसा कोई कारण है कि एमटीएल में इसके लिए कोई उदाहरण घोषित नहीं किया गया है? कृपया इसे समझने में मेरी मदद करें!
सादर मैरिएन
पुनश्च: मैंने पाया कि Blog Entry at blog.sigfpe.com जहां चर्चा एडवर्ड Kmett की अंत में कहीं कहते हैं:
"(...) मुझे याद है के रूप में, 'पास 'और' स्थानीय 'मौजूदा एमटीएल के साथ समस्याएं उत्पन्न करते हैं जब आप कंटेंट में मिश्रण करना शुरू करते हैं, और शायद अलग वर्गों में फैक्टर होना चाहिए। "
हो सकता है कि होल्डवाइटर से सुनने के लिए भी होल्ड होल्ड हो। तो सबसे आसान समाधान, अगर आप सुन सकते हैं और एक विशेष मामले में पारित करने की जरूरत नहीं है, उन्हें अपरिभाषित छोड़ने के लिए:
instance (MonadWriter w m) => MonadWriter w (ContT r m) where
tell= lift . tell
listen = undefined
pass = undefined
पुनश्च: (2011-03-11) इस विषय में डाइविंग आगे मैं ले कर आए हैं इस समाधान: (जब के रूप में ContT() पर r टाइप specifiying हम कोशिश कर सकते इस :)
instance (MonadWriter w m) => MonadWriter w (ContT() m) where
listen m = do
a <- m
(_,w) <- lift $ listen $ runContT m (return . (const()))
return (a,w)
यह कम्पाइल हो गया! और चलता है! लेकिन, हां, monadic कार्रवाई दो बार गणना की जानी चाहिए। क्या कोई इसे किसी भी तरह से दो कॉलों को ध्वस्त करने के संकेत के रूप में ले सकता है? फिर हम वांछित कार्यान्वयन प्राप्त करेंगे।
luqui! आपके उत्तर के लिए धन्यवाद। वैसे, आप मुझे MonadFix समझने के लिए लाया! – makelc
मैंने अभी प्रश्न संपादित किया है और ब्लॉग से कुछ जानकारी जोड़ दी है जहां मुझे संकेत मिले हैं कि एमटीएल में कुछ विधियां कंटेट के साथ मिश्रित होने पर समस्याएं पैदा करती हैं। विनम्र, मैरियन – makelc