[web-devel] Yesod Monoid instance for Endo [Header]
michael at snoyman.com
Thu Jun 9 14:20:23 CEST 2011
On Wed, Jun 8, 2011 at 9:25 PM, Tyson Whitehead <twhitehead at gmail.com> wrote:
> Hi All,
> I've been working my way through Yesod and noticed an irregularity.
> The GGHanlder monad stack (Yesod/Handler.hs)
> type GHInner s m monad a =
> ReaderT (HandlerData s m) (
> ErrorT HandlerContents (
> WriterT (Endo [Header]) (
> StateT GHState monad
> ) a
> has a WriterT member based on "Endo [Header]", which is locally defined as
> type Endo a = a -> a
> Therefore, unless I'm missing something, the Writer T Monoid instance must be
> Monoid b => Monoid (a -> b)
> Monoid [a]
> (i.e., an environment to list construct). Assuming the results a finally
> extracted by applying  (an empty environment), this would mean
> addHeader = GHandler . lift . lift . tell . (:)
> degrades to (++), giving non-constant time concatenation.
> I'm thinking what was really meant was to use the Endo Monoid instance,
> thereby gaining the constant-time concatenation via function composition.
> Cheers! -Tyson
> web-devel mailing list
> web-devel at haskell.org
Awesome catch, that's most definitely what was intended. I'll apply a patch.
More information about the web-devel