SlideShare uma empresa Scribd logo
1 de 16
LL 魂 Lightning Talk
Power 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 で導入
def putsName(x :{ def name :String }) = println(x.name)
object Foo { def name = "Foo" }
object Bar { def name = "Bar" }
var x = List[{def name :String}](Foo, Bar)
for(p <- x) putsName(p)
 Foo
Bar
Case class + pattern matching
 関数型言語でおなじみ
 case class で使用するデータ構造を定義
 match 構文で pattern match を行う
abstract class Term
case class Num(x :int) extends Term
case class Plus(l :Term, r :Term) extends Term
...
Plus(Num(100), Num(200)) match {
case Num(a) => ...
case 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 など
implicit def i2s(i :int) = i.toString
println(321.substring(1))  21
 用法・用量をよく守ってお使いください
 こんなことをしてはいけません
implicit def s2i(s :String) = Integer.parseInt(s)
var i :int = "hoge"
 java.lang.NumberFormatException: For input string: "hoge"
Singleton type
 特定のインスタンスを参照していることを
保証
 「自分自身」 (this) を返す型などが作れる
 カスケード呼び出しをするときなどに役立
つ
class Super {
def putsSuper() :this.type = { print("Super"); this }
}
class Sub extends Super {
def putsSub() :this.type = { println("Sub"); this }
}
...
new Sub().printSuper.printSub  SuperSub
Generic type
 Java generics と仕様は類似
 実は GJ の人 =Scala の人
class 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 { case Array("Foo", _ )* => println("Foo") }
 これを書いたらエラーメッセージ が表示され
た orz
x match {
case 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
 型や値を未定義の抽象的な型を定義できる
abstract class 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 のモジュールみたいなもの
 多重継承可能かつインスタンス化不可
trait Comparable[T <: Comparable[T]] {
def compareTo(o :T) :int
def <(o :T) = compareTo(o) < 0 ...
}
class Person(n :String) ... with Comparable[String] {
def name = n
override def compareTo(o :T) = n compareTo o.name
}
val bar = new Person("Bar"); val 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 で動作する静的型付けオブジェクト指向
言語
 絶賛開発停滞中
 少しずつ ( 本当に少しずつ ) 開発進めてます
 次のバージョンをリリースできるのはいつの
日か

Mais conteúdo relacionado

Mais procurados

並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
blackenedgold
 

Mais procurados (20)

Material
MaterialMaterial
Material
 
Haskell勉強会 in ie
Haskell勉強会 in ieHaskell勉強会 in ie
Haskell勉強会 in ie
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
言語処理系入門3
言語処理系入門3言語処理系入門3
言語処理系入門3
 
Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)
 
現実(えくせる)と戦う話
現実(えくせる)と戦う話現実(えくせる)と戦う話
現実(えくせる)と戦う話
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
 
言語処理系入門€2
言語処理系入門€2言語処理系入門€2
言語処理系入門€2
 
Haxeについて
HaxeについてHaxeについて
Haxeについて
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLisp
 

Semelhante a Power of Scala

BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
株式会社ランチェスター
 
第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪
Naoki Kitora
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Uehara Junji
 
初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)
Masahiro Hayashi
 

Semelhante a Power of Scala (20)

BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 
Haxe
HaxeHaxe
Haxe
 
Scala東北紹介
Scala東北紹介Scala東北紹介
Scala東北紹介
 
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
 
Scalaの文字列処理 Day 2 リテラル・補間子・特殊な文字
Scalaの文字列処理 Day 2 リテラル・補間子・特殊な文字Scalaの文字列処理 Day 2 リテラル・補間子・特殊な文字
Scalaの文字列処理 Day 2 リテラル・補間子・特殊な文字
 
演習:プログラミング言語処理をやってみよう (ver.1.01)
演習:プログラミング言語処理をやってみよう (ver.1.01)演習:プログラミング言語処理をやってみよう (ver.1.01)
演習:プログラミング言語処理をやってみよう (ver.1.01)
 
第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
 
初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介
 
Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)
 
2013-12-08 西区プログラム勉強会
2013-12-08 西区プログラム勉強会2013-12-08 西区プログラム勉強会
2013-12-08 西区プログラム勉強会
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
Rubyインスタンス変数
Rubyインスタンス変数Rubyインスタンス変数
Rubyインスタンス変数
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 

Mais de Kota Mizushima

こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラス
Kota Mizushima
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力
Kota Mizushima
 
日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足
Kota Mizushima
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
Kota Mizushima
 

Mais de Kota Mizushima (20)

ドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修について
 
kollectionの紹介
kollectionの紹介kollectionの紹介
kollectionの紹介
 
株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状
 
Macros in nemerle
Macros in nemerleMacros in nemerle
Macros in nemerle
 
Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -
 
Scalaの現状と今後
Scalaの現状と今後Scalaの現状と今後
Scalaの現状と今後
 
Scala Performance Tuning Tips
Scala Performance Tuning TipsScala Performance Tuning Tips
Scala Performance Tuning Tips
 
こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラス
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 
About Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and BorrowingAbout Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and Borrowing
 
Scala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful librariesScala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful libraries
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit Scala
 
言語アップデート -Scala編-
言語アップデート -Scala編-言語アップデート -Scala編-
言語アップデート -Scala編-
 
Scalaz
ScalazScalaz
Scalaz
 

Último

研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
atsushi061452
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
ssuserbefd24
 

Último (12)

ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
 

Power of Scala

  • 1. LL 魂 Lightning Talk Power of Scala 筑波大学大学院 水島 宏太
  • 2. Scala ?  最近ときどき言及される言語  cf. Matz にっき (2006-04-04)  Actor ライブラリなどで注目を集めている?  静的型付けオブジェクト指向関数型言語  ベースはオブジェクト指向言語  処理系は JVM 上で動作  近代的な言語仕様
  • 3. 紹介する Scala の機能  Structural subtyping  Case class + pattern matching  Lazy value  Implicit conversion(Views)  Singleton type  Generic type  Regular expression pattern  Existential Type  Abstract Type  Trait
  • 4. Structural subtyping  静的型でダックタイピング ( 相当 ) ができ るよ!  nominal VS. structural  2.6.0-RC1 で導入 def putsName(x :{ def name :String }) = println(x.name) object Foo { def name = "Foo" } object Bar { def name = "Bar" } var x = List[{def name :String}](Foo, Bar) for(p <- x) putsName(p)  Foo Bar
  • 5. Case class + pattern matching  関数型言語でおなじみ  case class で使用するデータ構造を定義  match 構文で pattern match を行う abstract class Term case class Num(x :int) extends Term case class Plus(l :Term, r :Term) extends Term ... Plus(Num(100), Num(200)) match { case Num(a) => ... case Plus(l, r) => println(l, r) }  (Num(100),Num(200))
  • 6. 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" ...
  • 7. Implicit conversion(Views)  ユーザが暗黙の型変換を定義可能  定義した変換はコンパイラの型チェックをパ スする  標準でいくつかの暗黙の変換が定義  int から long, int から double など implicit def i2s(i :int) = i.toString println(321.substring(1))  21  用法・用量をよく守ってお使いください  こんなことをしてはいけません implicit def s2i(s :String) = Integer.parseInt(s) var i :int = "hoge"  java.lang.NumberFormatException: For input string: "hoge"
  • 8. Singleton type  特定のインスタンスを参照していることを 保証  「自分自身」 (this) を返す型などが作れる  カスケード呼び出しをするときなどに役立 つ class Super { def putsSuper() :this.type = { print("Super"); this } } class Sub extends Super { def putsSub() :this.type = { println("Sub"); this } } ... new Sub().printSuper.printSub  SuperSub
  • 9. Generic type  Java generics と仕様は類似  実は GJ の人 =Scala の人 class Stack[T] { def push(e :T) = ... def pop = ... ... } ... val s = new Stack[String] s push "Foo" println(s pop)  Foo
  • 10. Regular expression pattern  現在は限定的なサポート  Sequence のパターンマッチで末尾に任意個 の要素が来る場合を扱える var x = Array("Foo", "Bar", "Baz") x match { case Array("Foo", _ )* => println("Foo") }  これを書いたらエラーメッセージ が表示され た orz x match { case Array("Foo", _ , "Baz") => println("Foo")* }  regular expressions not yet implemented
  • 11. 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 にも同等の機能が存在  ワイルドカード
  • 12. Abstract type  型や値を未定義の抽象的な型を定義できる abstract class Cell { type T; val value :T }  未定義の実装を与えることでインスタンス 化 val cell = new Cell { type T = int ; val value = 100 } println(cell.value)  100  Family polymorphism を実現できる  「クラスの集まり」を継承できる機能 ( 語弊 あり )  まともな説明は Scala のドキュメントを参照
  • 13. Trait  Ruby のモジュールみたいなもの  多重継承可能かつインスタンス化不可 trait Comparable[T <: Comparable[T]] { def compareTo(o :T) :int def <(o :T) = compareTo(o) < 0 ... } class Person(n :String) ... with Comparable[String] { def name = n override def compareTo(o :T) = n compareTo o.name } val bar = new Person("Bar"); val foo = new Person("Foo") println(foo < bar)  false
  • 14. まとめ  Structural subtyping  Case class + pattern matching  Lazy value  Implicit conversion(Views)  Singleton type  Generic type  Regular expression pattern  Existential Type  Abstract Type  Trait Scala サイ コー
  • 15. 参考資料  公式 Web ページ  http://www.scala-lang.org/  置いてあるドキュメントを読めば大体の機能はわ かる  ただし最新の機能に追従できてない場合あり  最新機能は処理系に付属の pdf 読んだ方がいいかも
  • 16. ちょっと宣伝  プログラミング言語 Onion 作ってます  http://www.onion-lang.org/ で公開中  JVM で動作する静的型付けオブジェクト指向 言語  絶賛開発停滞中  少しずつ ( 本当に少しずつ ) 開発進めてます  次のバージョンをリリースできるのはいつの 日か