scalaを勉強する
教材はこれ。
- 刺激を求める技術者に捧げるScala講座---目次:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20080613/308019/?ST=develop
初期設定など
- コンパイルして実行でエラー
コンパイル後のソースを以下のコマンドで実行できず、発狂しそうになる。
> scala helloWorld.class error: IO error while decoding C:\test\scala\HelloWorld.class with UTF-8 Please try specifying another one using the -encoding option one error found
classがいらなかったらしい。俺のミスだ。
>> scala helloWorld
>> Hello, world!
けど、もうちょっとわかりやすいメッセージ出してほしいです。
文法
- 変数の定義
- val 再代入不可 一度代入したら、変更不可
- var 再代入可能
- 型を指定しての宣言
>|| var num:Int = 3
- 関数の宣言
def min(x: Int, y: String) : Int = { }
戻り値の型が、コンパイラが判別できる場合は、記述不要
- if文
if( a>= b) { ... } else { ... }
処理内容が1行の場合は{}を省略可能
- case式
def ccc(x:String) = x match { case "yamada" => "Yamada" case "ushio" => "Ushio" case _ => "I don't know" }
- List(文法ではないが、後続のforの説明のために)
>>> var aList = List(1,2,3)
Listの連結
>> aList ::: List("yama")
Listの追加
>> "ddd" :: aList
読みにくいなあ。なんだよ:::って。
addとか、addAllの方がいい。と思った。
- ループの書き方いろいろ
for(num <- aList) yield println(num * 2) aList.map(i => i * 2) //iの部分の名称はなんでもよい aList.foreach(println _) //_じゃなくってはダメ while(i < aList.length) { ... }
高階関数的な書き方
関数自体を引数にしたり、戻り値とすること
var increase = (x:Int) => x + 1 def increase2(x:Int)(f: Int => Int) = { f(x); } increase2(3)(increase)
=>ってなんだっけ?
なんで(x:Int)(f: Int => Int)ってなるんだ?
(x: Int, f:Int => Int)のほうが...
ちなみに、(x:Int, f*Int => Int)っていう定義でも,動いた
任意の型のマップをmapする関数
def map[A,B](xs:List[A])(f:(A) => B):List[B] = if(xs.isEmpty) Nil else f(xs.head) :: map(xs.tail)(f)
ちなみにheadは一つ目の要素を、tailは二つ目以降の要素のListを返す
続く