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くらい使えるようになっておこうかな・・・