更新时间:2022-10-30 16:26:59
Scalaz does it as follows:
trait MA[M[_], A] {
def value: M[A]
def >>=(f: A => M[B])(implicit m: Monad[M]): M[B] =
m.bind(value, f)
}
With implicit conversions from M[A]
to MA[M, A]
for all M[_]
and A
:
implicit def ma[M[_], A](m: => M[A]): MA[M, A] = new MA[M, A] {
lazy val value = m
}
You just need a trait Monad
and an instance of it for every monad you care about:
trait Monad[M[_]] {
def pure[A](a: => A): M[A]
def bind[A, B](m: M[A], f: A => M[B]): M[B]
}