2013-06-20 5 views
6

आईओ को छोड़कर, आंतरिक मोनैड ट्रांसफॉर्मर वातावरण में फ़ंक्शन निष्पादित करने के लिए लिफ्ट का उपयोग करना आवश्यक नहीं है? मेरा मतलब है, अगर मेरे पास रीडर टी पर राइटर और राइटर पर स्टेटटी है, तो मैं ऐसा क्यों कर सकता हूं?मोनाड ट्रांसफॉर्मर्स और लिफ्ट फ़ंक्शन

tell $ {- any code here for the Writer -} 
foo <- asks {- This for the reader -} 
and so on... 

lift $ tell $ {- code ... -} 
... 

के बजाय

वहाँ एक विशेष विवरण है या यह एक ही तरीका है इकाई ट्रांसफॉर्मर लिखा गया है?

+3

[सभी उदाहरणों 'राइटर टी के पास] देखें [http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-Writer-Lazy.html#control.i : WriterT)। – icktoofay

+1

ध्यान दें कि यदि आप 'mtl' के बजाय 'ट्रांसफॉर्मर्स' लाइब्रेरी का उपयोग करते हैं तो आपको स्पष्ट रूप से सबकुछ 'लिफ्ट' करना होगा। –

उत्तर

7

यह क्योंकि इकाई ट्रांसफार्मर लाइब्रेरी (MTL) की मान्यता है कि यह काफी आम है तुम सिर्फ है कि रास्ते में monads ढेर के लिए तो वे बस कुछ समारोह (Mondoid w) => w -> Writer() रूप tell को परिभाषित नहीं है।

इसके बजाय उनके पास MonadWriter है जिसे एक टाइपक्लास के रूप में परिभाषित किया गया है जिसमें में एक फ़ंक्शन के रूप में बताया गया है। फिर वे MonadWriter: ReaderT, IO, Writer (डुह) इत्यादि के उदाहरणों का एक टन परिभाषित करते हैं और इस प्रकार आप lift. की कष्टप्रद पुनरावृत्ति से बचते हैं।

यह काफी आम है, किसी भी मोनड ट्रांसफॉर्मर (एमटीएल में) में Control.Monad.***.Class होगा जिसमें इस प्रकार का टाइपक्लास होगा।

+0

मैं समझता हूं !, मैंने मोनाड्स के उदाहरण नहीं पढ़े। धन्यवाद – Jcao02

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