हास्केल में दो अलग-अलग लेखक-प्रकार के मोनैड क्यों हैं? मेरे लिए सहजता से, "सख्त लेखक मोनैड" पढ़ने का अर्थ है कि <>
सख्त है, ताकि लॉग में कोई थंक बिल्डअप न हो। हालांकि, स्रोत कोड देख, यह पता चला है कि ऐसा नहीं है:लेखक का आलसी/सख्त संस्करण होने का क्या मतलब है?
-- Lazy Writer
instance (Monoid w, Monad m) => Monad (WriterT w m) where
-- ...
m >>= k = WriterT $ do
~(a, w) <- runWriterT m
~(b, w') <- runWriterT (k a)
return (b, w <> w')
सख्त संस्करण पैटर्न अकाट्य नहीं हैं, अर्थात ~
याद कर रहे हैं। तो ऊपर क्या होता है कि m
और k a
का मूल्यांकन नहीं किया जाता है, लेकिन थंक्स के रूप में संग्रहीत किया जाता है। सख्त संस्करण में, उनका मूल्यांकन यह जांचने के लिए किया जाता है कि वे ट्यूपल पैटर्न से मेल खाते हैं या नहीं, परिणाम <>
पर खिलाया जाता है। दोनों मामलों में, >>=
का मूल्यांकन तब तक नहीं किया जाता जब तक कि कुछ वास्तव में परिणामी मूल्य की मांग नहीं करता। तो जिस तरह से मैं समझता हूं कि आलसी और सख्त संस्करण दोनों एक ही काम करते हैं, सिवाय इसके कि >>=
की परिभाषा के अंदर उनके पास एक अलग जगह में थंक है: आलसी runWriterT
थंक्स का उत्पादन करती है, सख्त <>
थंक्स उत्पन्न करती है।
यह मैं दो सवालों के साथ छोड़ देता है:
- ऊपर सही है, या मैं यहाँ मूल्यांकन गलत करते हैं?
- क्या मैं अपना खुद का रैपर और उदाहरण लिखने के बिना सख्त
<>
पूरा कर सकता हूं?
प्रश्न 1 के लिए, उत्तर http://stackoverflow.com/questions/13186512/difference-between-haskells-lazy-and-strict-monads-or-transformers –