Skip to content

Instantly share code, notes, and snippets.

@erikkaplun
Last active August 29, 2015 14:08
Show Gist options
  • Save erikkaplun/58b7a8737ad39c48dc24 to your computer and use it in GitHub Desktop.
Save erikkaplun/58b7a8737ad39c48dc24 to your computer and use it in GitHub Desktop.
import scala.language.higherKinds
def optKleisli[M[_]: Applicative, A, B](fn: Kleisli[M, A, B]) = Kleisli[M, Option[A], Option[B]] {
case Some(t) => fn(t).map(_.some)
case None => Applicative[M].point(none[B])
}
@wemrysi
Copy link

wemrysi commented Oct 24, 2014

You can write this for any F[_] with an instance of Traverse:

def traverseKleisli[M[_], F[_], A, B](k: Kleisli[M, A, B])(implicit M: Applicative[M], F: Traverse[F]): Kleisli[M, F[A], F[B]] =
  Kleisli[M, F[A], F[B]](k.traverse)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment