Some suggestion you could do with them, to get a better feel for monads:
- Try using the Identity monad (from Control.Monad.Identity) instead of Maybe or Tray in maybe-line.hs and tray-line.hs. What happens on fail?
- Change generic-line.hs to use the do-Notation.
- Change state-line.hs such that StateT s becomes an instance of Monad; then use either >>= or the do-Notation.