В Проверки в 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" ++ "") ++ "!"
showsPrec
. - person Joey Adams   schedule 04.01.2012replicateM_
наreplicateM
, вывод станет"Hello" ++ ("World" ++ ("World" ++ "" ++ "") ++ "") ++ "!"
- person pat   schedule 05.01.2012sequence
иsequence_
:sequence = foldr (liftM2 (:)) (return [])
ноsequence_ = foldr (>>) (return ())
; первый генерирует больше привязок, потому что он работает с результатами. - person ehird   schedule 05.01.2012>>
должен быть ассоциативным. Но я не монадический юрист. - person Joey Adams   schedule 05.01.2012Writer w
будет следовать законам монад. Но неправоассоциативныеmappend
обычно неэффективны. - person ehird   schedule 05.01.2012