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を返す


続く