Scala試す

Scala特徴

以下wikibediaより。

* 静的型付け関数型言語のため、開発生産性が非常に高い
* 静的型付けのため、コンパイル時点でのエラー(特に型関連の)検出が得意である。また、型(クラス)をJavaなどと比べてより容易に作ることができ、また、型を使った条件分岐をはじめとして、型に関する機能が豊富なため、メソッドやメンバ変数を束ねるだけクラスではなく、型に積極的な意味を持たせてのプログラミングが可能である。
* Java.NET Frameworkの豊富なライブラリが使える
* 型推論があるため、多くの場所で型を自動的に補ってくれる
* 純粋関数型言語的な、val(定数)と不変List,Set,Mapという組み合わせでもプログラミングできるし、より手続き型的なvar(変数)と可変List,Set,Mapという組み合わせでもプログラミングができる
* 全てがオブジェクトである
* 関数もオブジェクトとして利用可能であり、カリー化が可能
* パターンマッチを利用可能であり、任意のクラスをグループ化してパターンマッチで判定させることが可能(CASEクラス)
* implicit def と言う宣言を用いて、既存のクラスを拡張したような記述が可能
* traitクラスを用いた、Mix-in機能を持つ
* Rubyに似たブロック(クロージャ)が利用可能
* XMLを直接プログラム内部に記述可能
* 標準ライブラリとして、Actorと呼ばれるErlangライクな文法の軽量プロセスが提供されている
* 遅延評価のある関数型言語であるため、無限リストを扱え、標準ライブラリにそのためのクラスが提供されている
* 構文解析のための、パーサーコンビネータが標準ライブラリに入っている
* ユニットテストのためのライブラリが標準ライブラリに入っている

要約すると、基本は静的型付けな関数型&オブジェクト指向のハイブリッド言語でIDEとかで補完など便利だけど、
動的言語っぽく動かすこともできちゃうよ。しかもJavaや.NETの上でさくさく。
ってことでしょうか。

環境作る

Eclipse3.3にアップデートサイトからプラグインを落とすといきなり使えた。
便利な時代になったもんだ。
以下アップデートサイト
http://www.scala-lang.org/downloads/distrib/files/nightly/scala.update/

なんかサンプル作る

以前erlangで作ったものを移植してみた。

package proj.teamdivide

import java.lang.Math;

object TeamDivide {
  def main(args : Array[String]) : Unit = {
    for ( e <- divide_leveled_list(numbering(4::2::3::3::1::Nil,1)).sort((t1,t2) => (t1._1 < t2._1)) )
    { println( print_team(e._2) + " vs " + print_team(e._3) + " ( "+teamlevel(e._2)+" vs "+teamlevel(e._3)+" )"); }
  }
  

  /*nのビットがonのリスト要素を持ったリストを返す*/
  def pickup[a] (list: List[a], n: Int): List[a]  = n match {
  case 0 => Nil;
  case 1 => list.head :: Nil;
  case _ => pickup(list.head::Nil,n % 2) ++ pickup(list.tail,n / 2);
  }
  
  /*n以下のビットがonのリスト要素を持ったリストのリストを返す*/
  def pickuplist[a] (list: List[a], n: Int): List[List[a]] = n match {
  case 0 => Nil::Nil;
  case _ => pickup(list,n)::Nil ++ pickuplist[a](list,n-1);
  }

  /*リストを2チームにわける全通り*/
  def dividelist[a] (list: List[a]): List[(List[a],List[a])] = {
    for {val i <- pickuplist[a](list,(1<<list.size)-1)}
    yield new Tuple2(i,(list--i));
  }

  /*チームの合計点*/
  def teamlevel (list: List[(Int,Int)]): Int = list match {
  case Nil => 0;
  case _ => list.head._2 + teamlevel(list.tail);
  }

  /*リストを2チームにわける全通り、レベル差付き*/
  def divide_leveled_list(list: List[(Int,Int)]): List[Tuple3[Int,List[(Int,Int)],List[(Int,Int)]]] = {
    for{val t <- dividelist(list)}
    yield new Tuple3(Math.abs(teamlevel(t._1)-teamlevel(t._2)),t._1,t._2);
  }
  
  /*レベルリストにプレイヤー番号を振る*/
  def numbering(list: List[Int], index: Int): List[(Int,Int)] = list match {
  case Nil => Nil;
  case _ => (index,list.head)::numbering(list.tail,index+1);
  }
  
  /*チームのプレイヤー番号文字列を作る*/
  def print_team(list: List[(Int,Int)]): String = list match {
  case Nil => "";
  case _ => list.head._1 + print_team(list.tail);
  }

}

言語仕様なんか読んじゃいないし、1時間ほどネットを徘徊して得た情報だけで書いたので見苦しいところもあるかもしれないけど、
逆に言うとそれくらいの初期学習コストで動かせてしまうというところでしょうか。
日本語の書籍が無いので、周囲に居る人に布教しまくることはできないけど、将来大いに期待。たぶんこれは流行る。

以下参考にしたサイト