Free


data Free a = Leaf a | Succ (Free a) deriving Show


instance Functor Free where
         fmap f (Leaf x) = Leaf (f x)
	 fmap f (Succ y) = Succ (fmap f y)	 


instance Monad Free where
	 return a = Leaf a	 
         Leaf x >>= f = f x 
	 Succ y >>= f = Succ (y >>= f)

En generalement

data Free f a = Leaf a | Succ (f (Free f a))

instance (Functor f) => Monad (Free f) where
	return a = Leaf a
	Leaf x >>= g = g x
	Succ y >>= g = Succ $ fmap (>>= g) y

This is the monad Free!

------- Free version of sequence 

seqFree :: (Monad m) => Free (m a) -> m (Free a)
seqFree (Leaf x) = do y <- x
		      return (Leaf y)		    

seqFree (Succ x) = do y <- seqFree x
		      return y

Tre Bien!

class NonAssMonoid a where
	mappend :: a -> a -> a 	

data Tree a = Leaf a | Node (Tree a) (Tree a) deriving Show

instance NonAssMonoid (Tree a) where
         	
         x `mappend` y = Node x y	 

This is the free non-associative monoid!