【发布时间】:2012-02-02 15:34:44
【问题描述】:
在Validations in Haskell 中声称使用Writer 可以保证右关联连接。然而,这个例子似乎另有说明。正确答案是什么?
{-# 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 是使用和实现
showsPrec的简单示例。 -
有趣的是,如果将
replicateM_替换为replicateM,则输出变为"Hello" ++ ("World" ++ ("World" ++ "" ++ "") ++ "") ++ "!" -
这是
sequence和sequence_的区别:sequence = foldr (liftM2 (:)) (return [])但是sequence_ = foldr (>>) (return ());前者生成更多绑定,因为它对结果进行处理。 -
无论如何,
>>应该是关联的。但我不是一元律师。 -
@JoeyAdams:确实;如果 w 遵循 Monoid 定律,
Writer w将遵循 Monad 定律。但非右关联mappends 通常效率低下。