2014-09-13 1 views

उत्तर

4

वास्तव में, ऐसा नहीं है कि MonadFix उदाहरण नहीं हो सकता है, बस लाइब्रेरी का प्रकार थोड़ा बाध्य है। आप सभी संभावित r रों अधिक ContT निर्धारित करते हैं तो न केवल MonadFix संभव हो जाता है, लेकिन ऊपर Monad के सभी उदाहरणों अंतर्निहित functor का कुछ भी नहीं की आवश्यकता होती है:

newtype ContT m a = ContT { runContT :: forall r. (a -> m r) -> m r } 
instance Functor (ContT m) where 
    fmap f (ContT k) = ContT (\kb -> k (kb . f)) 
instance Monad (ContT m) where 
    return a = ContT ($a) 
    join (ContT kk) = ContT (\ka -> kk (\(ContT k) -> k ka)) 
instance MonadFix m => MonadFix (ContT m) where 
    mfix f = ContT (\ka -> mfixing (\a -> runContT (f a) ka<&>(,a))) 
    where mfixing f = fst <$> mfix (\ ~(_,a) -> f a) 
+0

ऐसा लगता है कि अपने प्रकार वास्तव में अधिक कंस्ट्रेन्ड से एक है। क्या ऐसी वास्तविक परिस्थितियां हैं जहां बहुलक होने के लिए 'कंट्रोल' को तर्क को मजबूर करना उपयोगी कार्यान्वयन को अवरुद्ध करेगा? यदि नहीं, तो शायद यह इतिहास का मामला है- 'कॉन्ट टी' काफी समय से आसपास रहा है, संभवतः रैंक 2 प्रकार से पहले हास्केल का एक स्वीकार्य हिस्सा था। – dfeuer

+6

पॉलिमॉर्फिक तर्क 'कंटटी' को 'कोडोडेंसी' के रूप में भी जाना जाता है। इसमें 'कॉलसीसी' को परिभाषित करने की क्षमता नहीं है। –

+1

यह उत्तर बताता है कि आपका 'क्यों आर। (ए -> एम आर) -> एम आर '' कंटटी 'में' कॉलसीसी 'नहीं हो सकता है। http://stackoverflow.com/a/7180154/414413 – Cirdec

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