package scalaz trait MonadListen[F[_, _], W] extends MonadTell[F, W] { def listen[A](ma: F[W, A]): F[W, (A, W)] def pass[A](ma: F[W, (A, W => W)]): F[W, A] = bind(listen(ma)){ case ((a, f), w) => writer(f(w), a) } val monadListenSyntax = new scalaz.syntax.MonadListenSyntax[F, W]{} } object MonadListen { def apply[F[_, _], W](implicit ML: MonadListen[F, W]) = ML }