Created
November 28, 2019 10:30
-
-
Save windymelt/a18be1a3311b36b7f051a776822f12bb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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