2009年11月22日日曜日

Scalaが何か気持ち悪い

Scalaという、Java VM上で動く関数型 & オブジェクト指向言語を使ってみました。
関数型(関数は状態を持たず、結果は引数のみに依存する)なのにオブジェクト指向(オブジェクトは状態を持つ)とはこれ如何にという気がしてなりません。

"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) がおかしい。
うーん、これ関数型言語か?。「高階関数が使えるオブジェクト指向型言語」だったらまだ分かるけど。「高階関数が使える言語」と「関数型言語」とは違うだろー。と思ったがWikipediaによれば
関数型言語は、広い意味ではファーストクラスの関数オブジェクトを持つ言語である。
そうなのか・・・、だったらまぁ関数型言語かなー。うーん、気持ち悪いなー。
(あと、scalaインタプリタのコマンドラインで、Ctrl+DがDelにならないのがつらい)

追記 2012-02-04
タイトルを「Scala(スケイラ)が何か気持ち悪い」から「Scalaが何か気持ち悪い」に変更。なんで「スケイラ」と発音すると勘違いしたのか、今となっては不明。

0 件のコメント:

コメントを投稿