Skip to content

Instantly share code, notes, and snippets.

@chrislewis
Created April 4, 2011 00:21
Show Gist options
  • Save chrislewis/900965 to your computer and use it in GitHub Desktop.
Save chrislewis/900965 to your computer and use it in GitHub Desktop.
sketch of a monadic disjoint union (like Either, but a monad)
sealed trait Result[+F, S] {
def flatMap[FF >: F, SS](f: S => Result[FF, SS]): Result[FF, SS]
def map[SS](f: S => SS): Result[F, SS]
def fold[X](ff: F => X, fs: S => X): X
}
case class Failure[+F, S](x: F) extends Result[F, S] {
def flatMap[FF >: F, SS](f: S => Result[FF, SS]) = Failure[FF, SS](x)
def map[SS](f: S => SS) = Failure[F, SS](x)
def fold[X](ff: F => X, fs: S => X) = ff(x)
}
case class Success[+F, S](x: S) extends Result[F, S] {
def flatMap[FF >: F, SS](f: S => Result[FF, SS]) = f(x)
def map[SS](f: S => SS) = Success(f(x))
def fold[X](ff: F => X, fs: S => X) = fs(x)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment