2011年6月7日火曜日

Scalaのきほんのき

Windows EclipseへのScala IDE導入をあきらめたnouzui2007です。
日和ってすいませんm(_ _)m

Ubuntu版はあっさり使えたのに、なぜかWindows版がだめでした。
コンパイルして、実行すると、mainがないと怒られます(T T) うう

ま、それはそれとして
コマンドラインから使うことにして、とにかく勉強開始です。

簡単にセットアップ

  • Scalaご本尊をダウンロード&解凍して、適当なディレクトリに配置
  • 環境変数追加
    • SCALA_HOME=Scalaを配置した場所
    • PATH=%PATH%;%SCALA_HOMNE\bin


Dos窓登場
Scalaと入れてエンター
さー、開始です。


変数の定義

val・・・値型
var・・・変数型
scala>val n: Int = 1
n: Int = 1

scala>var m: Int = 2
m: Int = 2

scala> n = 1
:8: error: reassignment to val
       n = 1
         ^

scala> m = 3
m: Int = 3
ここ、大事
n = 4・・・error:再代入できないっす
m = 5・・・変数なのでOK
Scala推奨は、valでの定義です。

関数の定義

def 関数名(引数: 型, ・・・): 戻り値の型 = {
処理
}
scala> def greater(x: Int, y: Int): Int = {
     | if (x > y) x else y
     | }
greater: (x: Int, y: Int)Int

scala> greater(3, 9)
res0: Int = 9
型推論してくれるので、戻り値は省略可能
あくまで、コンパイラが推測できるなら、ね

制御構造

if (条件) 値1(絶対指定してね) else 値2
scala> if (true) 5 else 6
res1: Int = 5

scala> if (false) 5 else 6
res2: Int = 6

for (ブロック引数 <- コレクション; ・・・) 処理内容
for (ブロック引数 <- コレクション; ・・・) yield 値
scala> for (i <- 1 to 9) print (i + " ")
1 2 3 4 5 6 7 8 9

高階関数

高階関数ってゆーのはね、関数を引数にとる関数のことです。
なんのこっちゃ、ってゆー人は、nouzui2007と同じですので、がんばってくださいm(_ _)m 

mapとかfilterとかは、引数に関数を要求します。
書き方は、下をみてくださいね。
nで指定しているのが、=>以降の関数の引数になっています。
scala> List(1,2,3,4).map(n => n+1)
res5: List[Int] = List(2, 3, 4, 5)

scala> List(1,2,3,4).filter(n => n%2==0)
res6: List[Int] = List(2, 4) 
mapのほうは、Listに指定した要素ごとに、1を加算していって、結果をListにして返します。
filterのほうは、Listに指定した要素のうち、偶数になる要素をListにして返しています。

_ は魔法のことばです。
scala> List(1,2,3,4).map(_*2)
res7: List[Int] = List(2, 4, 6, 8)

クロージャ

無名関数について、おベンキョしましょう
scala> val sq = (n: Int) => n * 100
sq: (Int) => Int = 

scala> sq(9)
res9: Int = 900
無名関数はsqとゆー変数にセットしてますね。
ここはポイントです。
変数と関数に区別がないことに気づいたでしょうか?
私は気づきませんでした・・・orz

気づいた人は、こんなことができちゃうことがわかるかと思います。
scala> val sq = (n: Int) => n * 100
sq: (Int) => Int = 

scala> sq(9)
res9: Int = 900

scala> val alias = sq _
alias: (Int) => Int = 

scala> alias(10)
res10: Int = 1000
ここでもでました、魔法の言葉。
これは、仮引数です。
仮引数のときに括弧は省略できるようです。

ちょっと、頭が重くなってきたのでこの辺で。

0 件のコメント:

コメントを投稿