Validations in Haskell में दावा किया गया था कि Writer
का उपयोग सही-सहयोगी concatenation की गारंटी देता है। हालांकि, यह उदाहरण अन्यथा दिखाना प्रतीत होता है। सही जवाब क्या है?क्या लेखक मोनाड सही सहयोगी concatenation की गारंटी देता है?
{-# LANGUAGE OverloadedStrings #-}
import Control.Monad.Writer
import Data.String
data TM = TMempty
| TMappend TM TM
| TMfromString String
instance IsString TM where
fromString = TMfromString
instance Monoid TM where
mempty = TMempty
mappend = TMappend
instance Show TM where
showsPrec d TMempty = showString "\"\""
showsPrec d (TMfromString s) = showString $ show s
showsPrec d (TMappend a b) = showParen (d > 0) $
showsPrec 1 a .
showString " ++ " .
showsPrec 0 b
theWriter :: Writer TM()
theWriter = do
tell "Hello"
replicateM_ 2 $ tell "World"
tell "!"
main = print $ execWriter theWriter
का उत्पादन:
"Hello" ++ ("World" ++ "World" ++ "") ++ "!"
+1। –
दिलचस्प बात यह है कि यदि आप 'replicateM_' को 'replicateM'' से प्रतिस्थापित करते हैं, तो आउटपुट 'हैलो" ++ ("वर्ल्ड" ++ ("वर्ल्ड" ++ "" ++ "") ++ "") ++ " ! " – pat
यह 'अनुक्रम' और 'अनुक्रम_' के बीच का अंतर है:' अनुक्रम = फ़ोल्डर (लिफ्टएम 2 (:)) (वापसी [])' लेकिन 'sequence_ = foldr (>>) (वापसी())'; पूर्व अधिक बाध्य उत्पन्न करता है क्योंकि यह परिणाम के साथ चीजें करता है। – ehird