Created
November 14, 2015 16:08
-
-
Save mpilquist/4e30f217166cb2013af9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package mf | |
import cats._ | |
import cats.laws._ | |
trait MonadFix[F[_]] extends Monad[F] { | |
def mfix[A](f: Eval[A] => F[A]): F[A] | |
} | |
object MonadFix { | |
implicit val mfOption: MonadFix[Option] = new MonadFix[Option] { | |
def pure[A](a: A): Option[A] = Some(a) | |
def flatMap[A, B](fa: Option[A])(f: A => Option[B]): Option[B] = fa flatMap f | |
def mfix[A](f: Eval[A] => Option[A]): Option[A] = { | |
def unjust(o: Option[A]): A = o.getOrElse(sys.error("empty")) | |
lazy val x: Eval[Option[A]] = Eval.later(f(x.map(unjust))) | |
x.value | |
} | |
} | |
} | |
trait MonadFixLaws[F[_]] extends MonadLaws[F] { | |
implicit override def F: MonadFix[F] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment