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をもっとうまく書けないですかねー。