Skip to content

Instantly share code, notes, and snippets.

@rightfold
Created October 20, 2014 09:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rightfold/0644f73fa0ceeca383e7 to your computer and use it in GitHub Desktop.
Save rightfold/0644f73fa0ceeca383e7 to your computer and use it in GitHub Desktop.
trait Functor[F[_]] {
def map[T, U](function: T => U)(functor: F[T]): F[U]
}
trait Applicative[F[_]] extends Functor[F] {
def pure[T](value: T): F[T]
def seq[T, U](function: F[T => U])(functor: F[T]): F[U]
override def map[T, U](function: T => U)(functor: F[T]): F[U] =
seq(pure(function))(functor)
}
trait Monad[F[_]] extends Applicative[F] {
def bind[T, U](functor: F[T])(function: T => F[U]): F[U]
override def seq[T, U](function: F[T => U])(functor: F[T]): F[U] =
bind(function) { bfunction => bind(functor) { bfunctor => pure(bfunction(bfunctor)) } }
}
object ListInstance extends Monad[List] {
// only have to implement pure and bind; map and seq are derived
override def pure[T](value: T) = List(value)
override def bind[T, U](functor: List[T])(function: T => List[U]) =
functor flatMap function
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment