exInt
は別にわざわざ実装するほどのものではないけど,implicit def
を書いてみたくてw
でもこの例だと末尾再帰になってないからあんまり良い実装ではない.
/** | |
* 『すごいHaskell』で実装例が出ていたコラッツ数列をScalaで実装 | |
* | |
* コラッツ数列とは: | |
* ・任意の自然数から開始する | |
* ・数が1ならば、終了 | |
* ・数が偶数ならば、2で割る | |
* ・数が奇数ならが、3倍して1を足す | |
* ・新しい値でこのアルゴリズムを繰り返す | |
* | |
**/ | |
object collatzApp extends App { | |
collatz(10) foreach println // 結果は [10,5,16,8,4,2,1] | |
def collatz(number: Int): List[Int] = { | |
implicit def int2exInt(n: Int) = new exInt(n) | |
number match { | |
case 1 => List(1) | |
case n if n.isEven => List(n) ++ collatz(n / 2) | |
case n if n.isOdd => List(n) ++ collatz((n * 3) + 1) | |
} | |
} | |
/** | |
* ScalaのIntには偶数か奇数かを検査する関数が無いので, | |
* 拡張するクラスを実装. implicit defで変換して使う. | |
*/ | |
class exInt(val n: Int) { | |
lazy val isEven = n % 2 == 0 | |
lazy val isOdd = n % 2 != 0 | |
} | |
} |
exInt
は別にわざわざ実装するほどのものではないけど,implicit def
を書いてみたくてw
でもこの例だと末尾再帰になってないからあんまり良い実装ではない.