You could try something like this: trait Monad[+M[_]] { def unit[A](a: A): M[A] def bind[A, B](m: M[A])(f: A => M[B]): M[B] } // probably only works in Scala 2.8 implicit def monadicSyntax[M[_], A](m: M[A])(implicit tc: Monad[M]) = new { private val bind = tc.bind(m) _ def map[B](f: A => B) = bind(f compose tc.unit) def flatMap[B](f: A => M[B]) = bind(f) } implicit object MonadicOption extends Mon
![Monad trait in Scala](https://cdn-ak-scissors.b.st-hatena.com/image/square/98d6f053a97a87156775f60757c60865d0f2c47d/height=288;version=1;width=512/https%3A%2F%2Fcdn.sstatic.net%2FSites%2Fstackoverflow%2FImg%2Fapple-touch-icon%402.png%3Fv%3D73d79a89bded)