Skip to content

Instantly share code, notes, and snippets.

@caiorss
Forked from ElectricCoffee/MOption.scala
Created October 25, 2016 01:29
Show Gist options
  • Save caiorss/e94d865cd9da1e4288d5ade6bdbf9f14 to your computer and use it in GitHub Desktop.
Save caiorss/e94d865cd9da1e4288d5ade6bdbf9f14 to your computer and use it in GitHub Desktop.
Adds map and flatMap as extension methods to Scala, for those who don't want/need scalaz for their project, is fully compatible with for-comprehensions
package extension.monad
trait Monad[A, M[_]] {
// >>= :: Monad m => m a -> (a -> m b) -> m b
def flatMap[B](input: A => M[B]): M[B] // AKA "bind"
}
trait Functor[A, F[_]] {
// fmap :: Functor f => (a -> b) -> f a -> f b
def map[B](input: A => B): F[B] // AKA "fmap"
}
object MOption {
implicit class MonadicOption[A](left: Option[A]) extends Monad[A, Option] with Functor[A, Option] {
def flatMap[B](right: A => Option[B]): Option[B] = left match {
case Some(x) => right(x)
case None => None
}
def map[B](right: A => B): Option[B] = left match {
case Some(x) => Some(right(x))
case None => None
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment