power of scala
DESCRIPTION
My old presentation about Scala in LL Spirit(2006) !TRANSCRIPT
LL 魂 Lightning TalkPower of Scala
筑波大学大学院水島 宏太
Scala? 最近ときどき言及される言語
cf. Matzにっき (2006-04-04) Actorライブラリなどで注目を集めている?
静的型付けオブジェクト指向関数型言語 ベースはオブジェクト指向言語
処理系は JVM上で動作 近代的な言語仕様
紹介する Scalaの機能 Structural subtyping Case class + pattern matching Lazy value Implicit conversion(Views) Singleton type Generic type Regular expression pattern Existential Type Abstract Type Trait
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
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))
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" ...
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"
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
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
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
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にも同等の機能が存在 ワイルドカード
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のドキュメントを参照のこと
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
まとめ Structural subtyping Case class + pattern matching Lazy value Implicit conversion(Views) Singleton type Generic type Regular expression pattern Existential Type Abstract Type Trait
Scala サイコー
参考資料 公式Webページ
http://www.scala-lang.org/ 置いてあるドキュメントを読めば大体の機能はわかる
ただし最新の機能に追従できてない場合あり 最新機能は処理系に付属の pdf読んだ方がいいかも
ちょっと宣伝 プログラミング言語 Onion作ってます
http://www.onion-lang.org/ で公開中 JVMで動作する静的型付けオブジェクト指向言語
絶賛開発停滞中 少しずつ (本当に少しずつ )開発進めてます 次のバージョンをリリースできるのはいつの日か