power of scala

16
LL Lightning Talk Power of Scala 筑波大学大学院 水島 宏太

Upload: kota-mizushima

Post on 03-Jul-2015

680 views

Category:

Technology


1 download

DESCRIPTION

My old presentation about Scala in LL Spirit(2006) !

TRANSCRIPT

Page 1: Power of Scala

LL 魂 Lightning TalkPower of Scala

筑波大学大学院水島 宏太

Page 2: Power of Scala

Scala? 最近ときどき言及される言語

cf. Matzにっき (2006-04-04) Actorライブラリなどで注目を集めている?

静的型付けオブジェクト指向関数型言語 ベースはオブジェクト指向言語

処理系は JVM上で動作 近代的な言語仕様

Page 3: Power of Scala

紹介する Scalaの機能 Structural subtyping Case class + pattern matching Lazy value Implicit conversion(Views) Singleton type Generic type Regular expression pattern Existential Type Abstract Type Trait

Page 4: Power of Scala

Structural subtyping 静的型でダックタイピング (相当 )ができるよ! nominal VS. structural

2.6.0-RC1で導入 de f putsName(x :{ def name :Str ing }) = println(x.name) object Foo { def name = "Foo" } object Bar { def name = "Bar" } var x = List[{de f name :Str ing}](Foo, Bar) for(p <- x) putsName(p) Foo Bar

Page 5: Power of Scala

Case class + pattern matching 関数型言語でおなじみ case classで使用するデータ構造を定義 match構文で pattern matchを行う ab s tract c la s s Term ca s e c la s s Num(x :int) ex t ends Term ca s e c la s s Plus(l :Term, r :Term) extends Term ... Plus(Num(100), Num(200)) match { ca s e Num(a) => ... ca s e Plus(l, r) => println(l, r) } (Num(100),Num(200))

Page 6: Power of Scala

Lazy value 遅延評価を簡単に実現するための機構 2.6.0-RC1で導入 lazy val hello = { println("Hello"); "" }

hello Hello

hello 何も表示されない

2.6.0-RC1時点では buggyっぽいので注意 以下のコードで対話環境が落ちる scala> lazy val hello = println("Hello")

Exception in thread "main" ...

Page 7: Power of Scala

Implicit conversion(Views) ユーザが暗黙の型変換を定義可能

定義した変換はコンパイラの型チェックをパスする

標準でいくつかの暗黙の変換が定義 int から long, int から doubleなどimpl i c i t def i2s(i :int) = i.toStringprintln(321.substring(1)) 21

用法・用量をよく守ってお使いください こんなことをしてはいけません

impl i c i t def s2i(s :String) = Integer .par s eInt( s ) var i :int = "hoge" java.lang.NumberFormatException: For input string: "hoge"

Page 8: Power of Scala

Singleton type 特定のインスタンスを参照していることを保証

「自分自身」 (this)を返す型などが作れる カスケード呼び出しをするときなどに役立つ

c la s s Super { def putsSuper() :th i s . type = { print("Super"); th i s } } c la s s Sub extends Super { def putsSub() :th i s . type = { println("Sub"); th i s } } ... new Sub().printSuper.printSub SuperSub

Page 9: Power of Scala

Generic type Java genericsと仕様は類似

実は GJの人=Scalaの人 c la s s Stack[T] {

def push(e :T) = ...

def pop = ...

...

}

...

val s = new Stack[String]

s push "Foo"

println(s pop) Foo

Page 10: Power of Scala

Regular expression pattern 現在は限定的なサポート

Sequenceのパターンマッチで末尾に任意個の要素が来る場合を扱える

var x = Array("Foo", "Bar", "Baz") x match { ca s e Array("Foo", _ )* => println("Foo") } これを書いたらエラーメッセージ が表示された orz

x match { ca s e Array("Foo", _ , "Baz") => println("Foo")* } regular expressions not yet implemented

Page 11: Power of Scala

Existential type genericな型同士にサブタイプを導入できる Array[String]は Array[Any]のサブタイプ ではない

var x:Array[T forSome {type T <: Any}] = Array("A", "B")

x = Array(1, 2) OK!

x(0) + x(1) error: type mismatch;

Java Genericsにも同等の機能が存在 ワイルドカード

Page 12: Power of Scala

Abstract type 型や値を未定義の抽象的な型を定義できる ab s tract c la s s Cell { type T; val value :T }

未定義の実装を与えることでインスタンス化

val cell = new Cell { type T = int ; val value = 100 }

println(cell.value) 100

Family polymorphismを実現できる 「クラスの集まり」を継承できる機能 (語弊あり )

まともな説明は Scalaのドキュメントを参照のこと

Page 13: Power of Scala

Trait Rubyのモジュールみたいなもの

多重継承可能かつインスタンス化不可t ra i t Comparable[T <: Comparable[T]] { de f compareTo(o :T) :int de f <(o :T) = compareTo(o) < 0 ...}cla s s Person(n :String) ... wi th Comparable[String] { de f name = n overr ide def compareTo(o :T) = n compareTo o.name}val bar = new Person("Bar"); va l foo = new Person("Foo")println(foo < bar) false

Page 14: Power of Scala

まとめ Structural subtyping Case class + pattern matching Lazy value Implicit conversion(Views) Singleton type Generic type Regular expression pattern Existential Type Abstract Type Trait

Scala サイコー

Page 15: Power of Scala

参考資料 公式Webページ

http://www.scala-lang.org/ 置いてあるドキュメントを読めば大体の機能はわかる

ただし最新の機能に追従できてない場合あり 最新機能は処理系に付属の pdf読んだ方がいいかも

Page 16: Power of Scala

ちょっと宣伝 プログラミング言語 Onion作ってます

http://www.onion-lang.org/ で公開中 JVMで動作する静的型付けオブジェクト指向言語

絶賛開発停滞中 少しずつ (本当に少しずつ )開発進めてます 次のバージョンをリリースできるのはいつの日か