10
它在Validations in Haskell中聲稱使用Writer
可保證右關聯級聯。但是,這個例子似乎表明了其他情況。什麼是正確的答案?Writer Monad保證正確的關聯級聯嗎?
{-# 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" ++ "") ++ "!"
對於使用和實現'showsPrec'的簡單示例+1。 – 2012-01-04 19:10:26
有趣的是,如果用'replicateM'替換'replicateM_',則輸出變成''Hello「++(」World「++(」World「++」「++」「)++」「)++」 !'''' – pat 2012-01-04 20:08:55
'sequence'和'sequence_':'sequence = foldr(liftM2(:))(return [])'''但是'sequence_ = foldr(>>)(return())'之間的區別。前者會產生更多的綁定,因爲它會對結果進行處理。 – ehird 2012-01-04 20:11:30