Scalaに挑戦してみた

関西で開かれる関数型勉強会で、発表する機会を得たので、Haskell以外の関数型言語にも触れておく必要があると考えて、Scalaの使い方を覚える事にしました。
Scalaは今も後需要が高まっていきそうな言語なので、使えるようにしておくのは良いかもしれませんね。

Ubuntu10.4では、2.7.7finalがapt-getでインストールできました。
Scalaのバージョン情報についてはまったく解っていないのですが、最新は2.10.0となっています(?)
古いのは、Ubuntuリポジトリの関係上仕方ないでしょう。

$ sudo apt-get install scala

...

$ scala
Welcome to Scala version 2.7.7final (OpenJDK Server VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> 1+2
res0: Int = 3

早速スクリプトを書いてみます。
まずはお約束のHelloWorldから・・・

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello,World\n")
  }
}

コンパイルはscalac、実行はscalaコマンドを使うそうです。

$ scalac HelloWorld.scala
$ scala HelloWorld.class
error: IO error while decoding /home/tune/Proguram/scala/tests/easyTest/hello/HelloWorld.class with UTF-8
Please try specifying another one using the -encoding option
one error found

UTF8?なんだこりゃ?
と、エラーメッセージに従って -encodingオプションを付けたり色々試してみたけどダメみたい。
ググってみたら同じ事が起こってる人が居て、次のようにして実行してました。

$ scala -classpath . HelloWorld
Hello,World

これはどういう意味なんでしょうか?(´・ω・`)
ちょっと面倒くさいので後日vim拡張が必要ですね・・・

とりあえず、ちゃんと実行できたみたいなので、もうちょっと遊んでみます。
こちらもお約束のFizzBuzzを書いてみましょう。

object FizzBuzz {
  //Haskellみたいにパターンマッチングで綺麗に書けると思ったんだけど
  //少々ややこしそうなので今回はifで対応、要確認
  def fizbuz(x: Int):String =  {
    if(x%15==0) "FizzBuzz"
    else if(x%3==0) "Fizz"
    else if(x%5==0) "Buzz"
    else x.toString()
  }

  //戻り値は型推論で省略できるのかな?
  def main(args: Array[String]) =
    List.range(1,100).foreach( x => println(fizbuz(x)) )
}

実行結果:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz

...

97
98
Fizz

パターンマッチでどのくらいの事ができるのかいまいちよく解っていないので、その辺を中心に色々と勉強が必要そうです。
その他、遅延評価の仕方や無限リスト等、わりと覚える事はありそうです。

とりあえず少し調べてみた感じだと、やはりオブジェクト指向の色が強いみたいです。
Rubyに似てるような、似ていないような、そんな言語。

実際に資料作りを開始する前に、この言語と・・・あと、CommonLispくらい使えるようになっておこうかな・・・