600000007

プログラムと折り紙のブログです。

Scala by Example‎ > 演習6.0.3解答案その2

Scala by Example > 演習6.0.3の解答案その2です。

ヒントその2をベースにした解答です。

あるいは3つの子クラスとして Zero を 0 に、Succ を正の数のため、Pred を負の数のために使い、既知の Nat 実装を Integer へ一般化できます

ちょっと意味が分からない…原文を読んだ結果、NatをIntegerに改造して、その子クラスを3つ作れば良いと解釈しました。

  abstract class Integer {
    def isZero: Boolean
    def predecessor: Integer
    def successor: Integer
    def +(that: Integer): Integer
    def -(that: Integer): Integer
    def isPositive: Boolean
    def negate: Integer
  }

  object Zero extends Integer {
    def isZero: Boolean = true
    def isPositive: Boolean = false
    def predecessor: Integer = new Pred(Zero)
    def successor: Integer = new Succ(Zero)
    def +(that: Integer): Integer = that
    def -(that: Integer): Integer = that.negate
    def negate: Integer = this
  }

  class Succ(x: Integer) extends Integer {
    def isZero: Boolean = false
    def isPositive: Boolean = true
    def predecessor: Integer = x
    def successor: Integer = new Succ(this)
    def +(that: Integer): Integer = x + that.successor
    def -(that: Integer): Integer = x - that.predecessor
    def negate: Integer = {
      def iter(x: Integer, result: Integer): Integer = {
        if (x.isZero) result
        else
          iter(x.predecessor, result.predecessor)
      }
      iter(this, Zero)
    }
  }

  class Pred(x: Integer) extends Integer {
    def isZero: Boolean = false
    def isPositive: Boolean = false
    def predecessor: Integer = new Pred(this)
    def successor: Integer = x
    def +(that: Integer): Integer = x + that.predecessor
    def -(that: Integer): Integer = x - that.successor
    def negate: Integer = {
      def iter(x: Integer, result: Integer): Integer = {
        if (x.isZero) result
        else
          iter(x.successor, result.successor)
      }
      iter(this, Zero)
    }
  }

negateをもっとうまく書けないですかねー。