Гарантирует ли Writer Monad правильную ассоциативную конкатенацию?

В 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" ++ "") ++ "!"

10
задан Community 23 May 2017 в 12:12
поделиться