関数型(関数は状態を持たず、結果は引数のみに依存する)なのにオブジェクト指向(オブジェクトは状態を持つ)とはこれ如何にという気がしてなりません。
"Scala By Example" の Chapter 4まで読んで、末尾再帰版の factorial を実装してみました。
def fact(n: Int) = {これをロードして動作を確認します。
def factIter(n: Int, prod: Int): Int =
if (n <= 1) prod else factIter(n - 1, n * prod)
factIter(n, 1)
}
$ scalaうーん・・・。
Welcome to Scala version 2.7.7.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_15).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :load /tmp/factorial.scala
Loading /tmp/factorial.scala...
fact: (Int)Int
scala> fact(6)
res0: Int = 720
scala> fact(10)
res1: Int = 3628800
scala> fact(20)
res2: Int = -2102132736
- 型推論なし: factIter(...): Int の ": Int" は省略できません。推論しろよー。
- 型のbit長を意識しないと: Scala の Int は Java の int にマップされてるので singed 32bit integer となる。fact(20) がおかしい。
関数型言語は、広い意味ではファーストクラスの関数オブジェクトを持つ言語である。そうなのか・・・、だったらまぁ関数型言語かなー。うーん、気持ち悪いなー。
(あと、scalaインタプリタのコマンドラインで、Ctrl+DがDelにならないのがつらい)
追記 2012-02-04
タイトルを「Scala(スケイラ)が何か気持ち悪い」から「Scalaが何か気持ち悪い」に変更。なんで「スケイラ」と発音すると勘違いしたのか、今となっては不明。
0 件のコメント:
コメントを投稿