2016-10-08 14 views
7

Control.Monad.MorphControl.Monad.Morph.hoist क्यों एक मोनाद बाधा है?

class MFunctor t where 
    hoist :: Monad m => (forall a. m a -> n a) -> t m b -> t n b 

शामिल जहाँ तक मेरा बता सकते हैं, शामिल उदाहरणों में से कोई भी Monad m बाधा का उपयोग करें। कोई ऐसा कैसे कर सकता है? क्या वैध उदाहरण हैं जो बाधा का उपयोग करते हैं (यह कल्पना करना मेरे लिए थोड़ा मुश्किल है कि hoist id = id दिया गया)? m पर बाधा का महत्व क्या है और n नहीं है?

+0

मैं कुछ ['Control.Monad.Trans.Compose'] में ब्रेक करने की उम्मीद कर रहा था (https://hackage.haskell.org/package/mmorph-1.0.6/docs/Control-Monad-trans-Compose। एचटीएमएल), लेकिन सबकुछ 'मोनाद' पर 'मोनाड एम' के बिना ठीक से संकलित करता है ... – Alec

+0

शायद क्योंकि यह केवल मोनैड के लिए समझ में आता है? यह एक मोनैड ट्रांसफार्मर (ढेर) पर एक मजेदार है, जहां तक ​​मैं देख सकता हूं। – Xeo

+0

@Alec 'Control.Monad.Trans.Compose' में 'MFunctor' उदाहरण नहीं है। – Cirdec

उत्तर

6

Control.Monad.Morphpipes से एक spinoff है, इसलिए मुझे लगता है कि चाहते हैं यह वहाँ है, क्योंकि Proxy के लिए MFunctor उदाहरण यह की जरूरत है ... और यकीन है कि पर्याप्त यह used there है।

instance MFunctor (Proxy a' a b' b) where 
    hoist nat p0 = go (observe p0) 
     where 
     go p = case p of 
      Request a' fa -> Request a' (\a -> go (fa a)) 
      Respond b fb' -> Respond b (\b' -> go (fb' b')) 
      M   m -> M (nat (m >>= \p' -> return (go p'))) 
      Pure r  -> Pure r 

मुझे नहीं लगता कि यह हालांकि आवश्यक है है। m >>= return . ffmap f m है। यह शायद Functor बाधा होना चाहिए और वह कोड मोनैड-आवेदक प्रस्ताव के कार्यान्वयन की भविष्यवाणी करता है।

+0

क्या आप जानते हैं कि यह क्या कर रहा है? अर्थात्, या केवल दक्षता के लिए आवश्यक 'मोनाद' (या 'फंक्टर') बाधा है? – dfeuer

+0

यह 'm' के अंदर पुनरावर्ती रूप से 'hoist nat' मैपिंग कर रहा है। 'फेंक्टर' बाधा किसी भी ट्रांसफार्मर 'एम एम' के रूप में 'एम (टी एम ए)' के रूप में एक आश्चर्यजनक आवश्यकता नहीं होनी चाहिए। – Cirdec

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