Skip to content

Instantly share code, notes, and snippets.

@windymelt
Created November 28, 2019 10:30
Show Gist options
  • Save windymelt/a18be1a3311b36b7f051a776822f12bb to your computer and use it in GitHub Desktop.
Save windymelt/a18be1a3311b36b7f051a776822f12bb to your computer and use it in GitHub Desktop.
sealed trait Nat
final object One extends Nat
final case class Succ(val nat: Nat) extends Nat
final case class Odd(val nat: Nat)
final case class Even(val nat: Nat)
object Main extends App{
// 自然数の足し算を考えることができる
def plus(n: Nat, m: Nat): Nat = m match {
case One => Succ(n)
case Succ(mm) => plus(Succ(n), mm)
}
// 1は奇数であり,2は偶数であり,nの偶奇はn-2の偶奇と一致する
def natIsOddOrEven(n: Nat): Either[Odd, Even] = n match {
case One => Left(Odd(One))
case Succ(One) => Right(Even(Succ(One)))
case Succ(Succ(m)) => natIsOddOrEven(m) match {
case Left(Odd(_)) => Left(Odd(n))
case Right(Even(_)) => Right(Even(n))
}
}
// 自然数に1足すと偶奇が反転する
def succOddEven(n: Nat): Either[Odd, Even] = natIsOddOrEven(n) match {
case Left(Odd(_)) => Right(Even(Succ(n)))
case Right(Even(_)) => Left(Odd(Succ(n)))
}
println(succOddEven(plus(One, One)))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment