Skip to content

Instantly share code, notes, and snippets.

@folone
folone / gist:6258410
Last active April 27, 2018 14:09
Ackermann function
def ackermann(m: Int, n: Int): Int = {
(m, n) match {
case (0, _) ⇒ n + 1
case (m, 0) if m > 0 ⇒ ackermann(m - 1, 1)
case (m, n) if m > 0 && n > 0 ⇒ ackermann(m - 1, ackermann(m, n - 1))
}
}
import scalaz._, Scalaz._, Free.{suspend ⇒ _, _}, Trampoline._
def ackermannTramp(m: Int, n: Int): Trampoline[Int] = {
@chrislewis
chrislewis / Result.scala
Created April 4, 2011 00:21
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)