, :
instance Monoid (Ftree a) where
mempty = Empty
mappend = Branch
Monoid, .
? - , . (, ), (, (), ). , .
BTW: , , ...
Monad (Ftree a), Monoid:
instance (Monoid a, Monad f) => Monoid (f a) where
mempty = return mempty
mappend f g = f >>= (\x -> (mappend x) `fmap` g)
, . <> = mappend. , Monad ( ). , do-notation.
mappend, do-Notation, :
mappend f g = do
x <- f
y <- g
return (f <> g)
, :
mappend mempty g
≡ -- Definition of mappend
do
x <- mempty
y <- g
return (x <> y)
≡ -- Definition of mempty
do
x <- return mempty
y <- g
return (x <> y)
≡ -- Monad law
do
y <- g
return (mempty <> y)
≡ -- Underlying monoid laws
do
y <- g
return y
≡ -- Monad law
g
mappend f mempty
≡
do
x <- f
y <- mempty
return (x <> y)
≡
do
x <- f
return (x <> mempty)
≡
do
x <- f
return x
≡
f
,
mappend f (mappend g h)
≡
do
x <- f
y <- do
x' <- g
y' <- h
return (x' <> y')
return (x <> y)
≡
do
x <- f
x' <- g
y' <- h
y <- return (x' <> y')
return (x <> y)
≡
do
x <- f
x' <- g
y' <- h
return (x <> (x' <> y'))
≡
do
x <- f
x' <- g
y' <- h
return ((x <> x') <> y')
≡
do
x <- f
x' <- g
z <- return (x <> x')
y' <- h
return (z <> y')
≡
do
z <- do
x <- f
x' <- g
return (x <> x')
y' <- h
return (z <> y')
≡
mappend (mappend f g) h
, () Monad ( , #haskell), Monoid. , .