SlideShare une entreprise Scribd logo
1  sur  29
Télécharger pour lire hors ligne
pattern matching
自己紹介 
twitter ID : @naoki_wada 
株式会社ジークス 
Web系のお仕事やっています 
仕事で Scala は使ってません 
3児のパパやってます
ワイルドカードパターン 
定数パターン 
変数パターン 
コンストラクタパターン 
シーケンスパターン 
タプルパターン 
型付パターン
ちょっとその前に
ワイルドカードパターン 
expr match { 
case BinOp(op , left , right) 
=> println(expr + " は二項演算") 
case _ => println(“その他”) 
} 
Javaのswitchでいうdefaultみたいなもん
ワイルドカードパターン 
expr match { 
case BinOp(_ , _ , _) 
=> println(expr + " は二項演算") 
case _ => println(”その他”) 
} 
引数の数を見るだけならこんな書き方も
定数パターン 
def describe(x: Any) = x match { 
case 5 => ”五” 
case true => ”真実” 
case ”hello” => ”こんにちは” 
case Nil => ”空っぽのリスト” 
case _ => ”その他” 
} 
Javaと違っていろんな型が使える
変数パターン 
expr match { 
case 0 => ”ぜろ” 
case somethingElse 
=> ”ぜろ以外”+ somethingElse 
} 
動き的にはワイルドカードと同じ 
でも、マッチした値を変数に束縛
ちょっとおまけ 
先頭が大文字を定数とみなす 
小文字の場合はパターン変数とみなす
ちょっとおまけ 
import math.{E,Pi} 
E match { 
case Pi => ”Piです” 
case _ => ”OK” 
} 
E match { 
case pi => ”Piです” 
case _ => ”OK” 
} 
実際はワイルドカードが2個になるのでエラーになります
コンストラクタパターン 
expr match { 
case BinOp(”+”,e, Number(0)) 
=> println(”ディープマッチ”) 
case _ => 
} 
これは対象が case class の場合
case class って?
case class 
abstract class Pet 
case class Dog(name: String) extends Pet 
case class Cat(name: String) extends Pet 
case修飾子をつけるだけ 
val genki = Dog(”げんき”) 
val kitty = Cat(”キティー”) 
new がいらない!
え? それだけ?
case class ほかにも 
toString 
hashCode 
equals 
これらの「自然な」実装を追加してくれる
toString 
class Dog(name:String) 
val dog = new Dog(”りき”) 
Dog@33063f5b 
case class Dog(name:String) 
val dog = Dog(”りき”) 
Dog(りき) 
いい感じ
equals 
class Dog(name:String) 
val dog = new Dog(”りき”) 
val dog2 = new Dog(”りき”) 
dog == dog2 
false 
case class Dog(name:String) 
val dog = Dog(”りき”) 
val dog2 = Dog(”りき”) 
dog == dog2 
true 
いい感じ
シーケンスパターン 
expr match { 
case List(0, _, _) => println(“見つけた”) 
case _ => 
} 
固定数 
expr match { 
case List(0, _*) => println(“見つけた”) 
case _ => 
} 
先頭だけ見る
タプルパターン 
def tupleDemo(expr: Any) = 
expr match { 
case (a, b, c) 
=> println(“みつけた” + a + b + c) 
case _ => 
} 
scala>tupleDemo(1,”abc”,List(1,2,3)) 
みつけた 1 abc List(1,2,3)
型付パターン 
def generalSize(x: Any) = 
x match { 
case s: String => s.length 
case m: Map[_ ,_] => m.size 
case _ => -1 
} 
scala>generalSize(Map(”1”->123,”2”,456)) 
res1: AnyVal = 2
パターンガード 
x match { 
case n: Int if n > 0 => println(”自然数”) 
case s: String if s(0) == ’a’ 
=> println(”aから始まる”) 
case _ => 
}
シールドクラス 
sealed abstract class Pet 
case class Dog(name: String) extends Pet 
case class Cat(name: String) extends Pet 
case class Cow(name: String) extends Pet 
def sealedMatch(p: Pet) = 
p match { 
case d: Dog => ”いぬの名前は” + d.name 
} 
<console>:11: warning: match may not be exhaustive. 
It would fail on the following inputs: Cat(_), Cow(_)
変数の束縛 
sealed abstract class Pet 
case class Dog(name: String) extends Pet 
case class Cat(name: String) extends Pet 
case class Cow(name: String) extends Pet 
def sealedMatch(p: Pet) = 
p match { 
case Dog(x @ _) => ”いぬの名前は” + x 
case _ => ”そのた” 
}
変数定義でパターン 
val tuple = (123, ”ABC”) 
val (number,string) = tuple 
number: Int = 123 
string: String = ABC 
case class Op(op:String, left:Int, right:Int) 
val plusOp = Op(”+”, 2, 5) 
val Op(op,left,right) = plusOp 
op: String = + 
left: Int = 2 
right: Int = 5
case class 以外で
抽出子 
object UpperCase { 
def unapply(s:String):Boolean 
= s.toUpperCase == s 
} 
def isUpper(s:String) = 
s match { 
case UpperCase() => ”大文字” 
case _ => ”その他” 
}
詳しくは 
コップ本第26章で
コップ本読書会やってます 
毎週月曜日 19:00 ~ 21:00 
次回開催予定日 
2015年01月13日 19:00 ~ 
第18章 ステートフルオブジェクト 
第19章 型のパラメータ化
ご静聴ありがとうございました

Contenu connexe

Tendances

Parsing Left Recursive PEG
Parsing Left Recursive PEGParsing Left Recursive PEG
Parsing Left Recursive PEGTakayuki Goto
 
モナドがいっぱい!
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!Kenta Sato
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールNobuhisa Koizumi
 
Scalaのオブジェクトの話
Scalaのオブジェクトの話Scalaのオブジェクトの話
Scalaのオブジェクトの話Yasuyuki Maeda
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイドShinta Hatatani
 
"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6risou
 
Unity + C#講座①
Unity + C#講座①Unity + C#講座①
Unity + C#講座①Yu Yu
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数Shinichi Kozake
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺちdo_aki
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
第3回輪講
第3回輪講第3回輪講
第3回輪講mh_amako
 
第4回 PHPのおさらい
第4回 PHPのおさらい第4回 PHPのおさらい
第4回 PHPのおさらいSawada Makoto
 

Tendances (20)

Power of Scala
Power of ScalaPower of Scala
Power of Scala
 
Parsing Left Recursive PEG
Parsing Left Recursive PEGParsing Left Recursive PEG
Parsing Left Recursive PEG
 
モナドがいっぱい!
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
CLR/H No.35-2
CLR/H No.35-2CLR/H No.35-2
CLR/H No.35-2
 
20120127 nhn
20120127 nhn20120127 nhn
20120127 nhn
 
Scalaのオブジェクトの話
Scalaのオブジェクトの話Scalaのオブジェクトの話
Scalaのオブジェクトの話
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイド
 
"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6
 
Unity + C#講座①
Unity + C#講座①Unity + C#講座①
Unity + C#講座①
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
F#のすすめ
F#のすすめF#のすすめ
F#のすすめ
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺち
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
第3回輪講
第3回輪講第3回輪講
第3回輪講
 
第4回 PHPのおさらい
第4回 PHPのおさらい第4回 PHPのおさらい
第4回 PHPのおさらい
 
Pythonintro
PythonintroPythonintro
Pythonintro
 

En vedette

20130202 unitycreators prefab
20130202 unitycreators prefab20130202 unitycreators prefab
20130202 unitycreators prefabKonabe Kurisaka
 
Kb pur 裂縫灌注樹脂簡報 (短)
Kb pur 裂縫灌注樹脂簡報 (短)Kb pur 裂縫灌注樹脂簡報 (短)
Kb pur 裂縫灌注樹脂簡報 (短)joe1118
 
Bab 5 pergudangan
Bab 5 pergudanganBab 5 pergudangan
Bab 5 pergudanganyanamohamad
 
UE4学園追放による頭位置移動入力方法
UE4学園追放による頭位置移動入力方法UE4学園追放による頭位置移動入力方法
UE4学園追放による頭位置移動入力方法Konabe Kurisaka
 

En vedette (14)

Soalan kertas 2
Soalan kertas 2Soalan kertas 2
Soalan kertas 2
 
Google translate (new)
Google translate (new)Google translate (new)
Google translate (new)
 
Soalan kertas 2
Soalan kertas 2Soalan kertas 2
Soalan kertas 2
 
20130202 unitycreators prefab
20130202 unitycreators prefab20130202 unitycreators prefab
20130202 unitycreators prefab
 
Kb pur 裂縫灌注樹脂簡報 (短)
Kb pur 裂縫灌注樹脂簡報 (短)Kb pur 裂縫灌注樹脂簡報 (短)
Kb pur 裂縫灌注樹脂簡報 (短)
 
Nota1
Nota1Nota1
Nota1
 
Bab 5 pergudangan
Bab 5 pergudanganBab 5 pergudangan
Bab 5 pergudangan
 
The formation and management of middle ear granulation
The formation and management of middle ear granulationThe formation and management of middle ear granulation
The formation and management of middle ear granulation
 
Soalan objektif
Soalan objektifSoalan objektif
Soalan objektif
 
Nota bab 5
Nota bab 5Nota bab 5
Nota bab 5
 
Nota bab 4
Nota bab 4Nota bab 4
Nota bab 4
 
UE4学園追放による頭位置移動入力方法
UE4学園追放による頭位置移動入力方法UE4学園追放による頭位置移動入力方法
UE4学園追放による頭位置移動入力方法
 
Soalan objektif
Soalan objektifSoalan objektif
Soalan objektif
 
Flipkart success story
Flipkart success storyFlipkart success story
Flipkart success story
 

Similaire à 関西Scala勉強会 パターンマッチング

BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
JavaScriptの正規表現
JavaScriptの正規表現JavaScriptの正規表現
JavaScriptの正規表現yaju88
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)Nozomu Kaneko
 
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章Yuta Yokoi
 
2011年12月2日
2011年12月2日2011年12月2日
2011年12月2日nukaemon
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミングOuka Yuka
 
Haskell勉強会2 in ie
Haskell勉強会2 in ieHaskell勉強会2 in ie
Haskell勉強会2 in iemaeken2010
 
Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】Yukiko Kato
 
すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-Hiromasa Ohashi
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語ScalaTanUkkii
 
こんなEqualsは嫌だ
こんなEqualsは嫌だこんなEqualsは嫌だ
こんなEqualsは嫌だOda Shinsuke
 
wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料Mizuki Yamanaka
 

Similaire à 関西Scala勉強会 パターンマッチング (14)

BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
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の正規表現
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
 
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章
 
2011年12月2日
2011年12月2日2011年12月2日
2011年12月2日
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
Haskell勉強会2 in ie
Haskell勉強会2 in ieHaskell勉強会2 in ie
Haskell勉強会2 in ie
 
Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】
 
すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語Scala
 
こんなEqualsは嫌だ
こんなEqualsは嫌だこんなEqualsは嫌だ
こんなEqualsは嫌だ
 
wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料
 

関西Scala勉強会 パターンマッチング