SlideShare a Scribd company logo
Scala
1
3 Scala 2016 7 10 erin
•
• Scalaz
•
• Haskell
2
•
• Scala
•
3
•
→ Haskell
• Scala
→ List Option map flatMap for
•
→
4
•
•
5
•
•
6
•
→ IO
•
→
7
val addTwo:Int=>Int = a => {
a+2
}
val addTwoThree = addTwo(3)
println(addTwoThree) // 5
println(addTwoThree) // 5
↓ ↓
println(addTwo(3)) // 5
println(addTwo(3)) // 5
8
•
•
9
val acc=Array(0)
val addTwo:Int=>Int = a => {
acc(0) = acc(0)+a+2
acc(0)
}
val addTwoThree = addTwo(3)
println(addTwoThree) // 5
println(addTwoThree) // 5
↓ ↓
println(addTwo(3)) // 5
println(addTwo(3)) // 10
10
•
• IO
11
•
•
•
•
12
13
•
→
•
14
15
•
•
16
• List Option
IO State
•
→
17
•
18
•
→
•
→ A => M[B]
•
→ M[A] >>= (A => M[B])
→ x >>= f = ???
→ ??? >>=
→ flatMap
19
Int=>List[String]
List[String] >>= (String=>List[Int])
• Option
→ None None
Some(4).flatMap(a=>(Some(3).flatMap(b=>Some(a*b)))) // Some(12)
Some(4).flatMap(a=>((None:Option[Int]).flatMap(b=>Some(a*b)))) // None
• List
→
List(1,2,3).flatMap(a=>(List(4,5,6).flatMap(b=>List(a*b))))
// List(4, 5, 6, 8, 10, 12, 12, 15, 18)
• State
→
20
flatMap
val om = for {
a <- Some(4)
b <- None:Option[Int]
} yield (a*b) // None
val lm = for {
a <- List(1,2,3)
b <- List(4,5,6)
} yield (a*b) // List(4, 5, 6, 8, 10, 12, 12, 15, 18)
21
for
(A => M[B]) >>= (B => M[C]) >>= (C => M[D])
→ A => M[D]
→
val lm = (x:Int) => for {
a <- List(1,2,3).map(_*x)
b <- List(4,5,6).map(_*a)
} yield b
lm(2) // List(8, 10, 12, 16, 20, 24, 24, 30, 36)
22
List
•
•
23
24
•
• IO Reader Writer
•
25
State
•
A => S => (B,S)
B => S => (C,S)
C => S => (D,S)
•
A => M[B]
B => M[C]
C => M[D]
→ (A => M[B]) >>= (B => M[C]) >>= (C => M[D])
→ State[S,A] >>= (A => State[S,B])
→ flatMap
26
case class State[S,A](runState: S => (A,S)) {
def flatMap[B]:(A=>State[S,B])=>State[S,B] = f => State(s => {
val (a,s1) = this.runState(s)
f(a).runState(s1)
})
def map[B]:(A=>B)=>State[S,B] = f => flatMap(a=>State.unit(f(a)))
}
case object State {
def unit[S,A]:A=>State[S,A] = a => State(s => (a,s))
}
27
flatMap
•
28
State
val push:Int=>State[List[Int],Unit] = a => State(s => ((), a::s))
val pop:State[List[Int],Int] = State(s => (s.head, s.tail))
val calc:(Int=>Int=>Int)=>State[List[Int],Unit] = f => {
for {
a <- pop
b <- pop
_ <- push (f(a)(b))
} yield ()
}
val plus:Int=>Int=>Int = a => b => b+a
val minus:Int=>Int=>Int = a => b => b-a
val mult:Int=>Int=>Int = a => b => b*a
val div:Int=>Int=>Int = a => b => b%a
29
// 2 3 + 4 1 - * = (2+3)*(4-1)
val dc = for {
_ <- push (2)
_ <- push (3)
_ <- calc (plus)
_ <- push (4)
_ <- push (1)
_ <- calc (minus)
_ <- calc (mult)
} yield ()
dc.runState(List.empty)
30
•
•
• State
31
Parser
case class Parser[S,A](runParser: S => Option[(A,S)]) {
def flatMap[B]:(A=>Parser[S,B])=>Parser[S,B] = f => Parser(s => {
val o = this.runParser(s)
o.flatMap{
case (a,s1) => f(a).runParser(s1)
}
})
def map[B]:(A=>B)=>Parser[S,B] = f => flatMap(a=>Parser.unit(f(a)))
}
case object Parser {
def unit[S,A]:A=>Parser[S,A] = a => Parser(s => Some((a,s)))
}
32
flatMap
•
33
Parser
val item:Parser[String,Char] = {
Parser(s => if (s.length > 0) {
Some((s.head, s.tail))
} else {
None
})
}
val satisfy:(Char=>Boolean)=>Parser[String,Char] = f => {
for {
c <- item
n <- Parser(s => if (f(c)) {
Some((c,s))
} else {
None
}):Parser[String,Char]
} yield n
}
val char:Char=>Parser[String,Char] = c => satisfy((x:Char)=>x==c)
val digit:Parser[String,Char] = satisfy((x:Char)=>x.isDigit)
val letter:Parser[String,Char] = satisfy((x:Char)=>x.isLetter)
34
val p = for {
a <- letter
b <- char(a)
c <- digit
d <- digit
e <- digit
f <- digit
} yield List(a,b,c,d,e,f).mkString
p.runParser(“AA0123") // Some(“AA0123”,)
p.runParser(“AB0123") // None
p.runParser("A90123") // None
p.runParser("990123") // None
35
•
•
36
• flatMap
•
→ for
•
→
•
→
37
• Scala
•
38
39

More Related Content

PDF
Data platformdesign
PDF
運用が楽になる分散データベース Riak
PPTX
SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方
PDF
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata
PDF
AWS Black Belt Techシリーズ Amazon EBS
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
PPTX
[BurpSuiteJapan]HTTP基礎入門
PDF
Elasticsearch勉強会#44 20210624
Data platformdesign
運用が楽になる分散データベース Riak
SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata
AWS Black Belt Techシリーズ Amazon EBS
SPAセキュリティ入門~PHP Conference Japan 2021
[BurpSuiteJapan]HTTP基礎入門
Elasticsearch勉強会#44 20210624

What's hot (20)

PDF
Proxy War
PPTX
Goss入門
PDF
データインターフェースとしてのHadoop ~HDFSとクラウドストレージと私~ (NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
PPTX
NTTデータが考えるデータ基盤の次の一手 ~AI活用のために知っておくべき新潮流とは?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
PPTX
Hadoop -NameNode HAの仕組み-
PDF
Go言語によるwebアプリの作り方
PDF
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
PDF
まずやっとくPostgreSQLチューニング
PPTX
ウェブセキュリティのありがちな誤解を解説する
PPT
Cassandraのしくみ データの読み書き編
PDF
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
PPTX
Impala + Kudu を用いたデータウェアハウス構築の勘所 (仮)
PDF
RDF Semantic Graph「RDF 超入門」
PPTX
BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)
PPTX
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
PDF
Akkaとは。アクターモデル とは。
PPTX
Redisの特徴と活用方法について
PDF
Jmespathをもっと広めたい
Proxy War
Goss入門
データインターフェースとしてのHadoop ~HDFSとクラウドストレージと私~ (NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
NTTデータが考えるデータ基盤の次の一手 ~AI活用のために知っておくべき新潮流とは?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
Hadoop -NameNode HAの仕組み-
Go言語によるwebアプリの作り方
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
まずやっとくPostgreSQLチューニング
ウェブセキュリティのありがちな誤解を解説する
Cassandraのしくみ データの読み書き編
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Impala + Kudu を用いたデータウェアハウス構築の勘所 (仮)
RDF Semantic Graph「RDF 超入門」
BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
Akkaとは。アクターモデル とは。
Redisの特徴と活用方法について
Jmespathをもっと広めたい
Ad

Viewers also liked (20)

PDF
オンプレミスから AWS への劇的ビフォーアフター
PDF
Reactor 3.0, a reactive foundation for java 8 and Spring
PDF
インターンシップの学生にお届けしようとしたScalaの文法(初級編)
PDF
Scala kansai summit-2016
PDF
ガチのスタートアップがScalaを採用した結果(公開版) #scala_ks
TXT
Ref
PPTX
Patrones de medición
PPT
Изучение планет Солнечной системы
PDF
Tableau - ANAND CHOKHI DEMO - Filled Map Chart
PDF
Internal Social and Collaboration presented at 18F
PDF
Daily Newsletter: 19th July, 2011
PPT
Brief overview of New Curriculum for IL
PDF
Open Budget Data: A Landscape Analysis
PPTX
Прямые продажи облачных сервисов
PPTX
Working Mechanism of Pinterest and LinkedIn
PDF
Case estágio - Proposta de interface para um módulo de estratégia do sistema ...
PPTX
Как думать о коммерциализации Искусственного Интеллекта и не разочароваться з...
PDF
Visual Storytelling Part 1: PLOT Your Presentation
PPT
Redvolucion historias inspiradoras jennifer
PPTX
Panda lacotion
オンプレミスから AWS への劇的ビフォーアフター
Reactor 3.0, a reactive foundation for java 8 and Spring
インターンシップの学生にお届けしようとしたScalaの文法(初級編)
Scala kansai summit-2016
ガチのスタートアップがScalaを採用した結果(公開版) #scala_ks
Ref
Patrones de medición
Изучение планет Солнечной системы
Tableau - ANAND CHOKHI DEMO - Filled Map Chart
Internal Social and Collaboration presented at 18F
Daily Newsletter: 19th July, 2011
Brief overview of New Curriculum for IL
Open Budget Data: A Landscape Analysis
Прямые продажи облачных сервисов
Working Mechanism of Pinterest and LinkedIn
Case estágio - Proposta de interface para um módulo de estratégia do sistema ...
Как думать о коммерциализации Искусственного Интеллекта и не разочароваться з...
Visual Storytelling Part 1: PLOT Your Presentation
Redvolucion historias inspiradoras jennifer
Panda lacotion
Ad

Similar to Scalaエンジニアのためのモナド入門 (20)

PDF
Scala Hands On!!
PDF
Monad Transformers - Part 1
PPT
Functional programming in scala
PDF
Send + More = Money – Let’s mash 2 monads to solve a simple CSP
PDF
Scala 101
PDF
High Wizardry in the Land of Scala
PDF
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
PDF
A Prelude of Purity: Scaling Back ZIO
PDF
学生向けScalaハンズオンテキスト
PDF
The Essence of the Iterator Pattern (pdf)
PPT
Thesis PPT
PPT
Thesis
PPTX
The Essence of the Iterator Pattern
PPTX
Introduction to Monads in Scala (2)
PDF
Demystifying functional programming with Scala
PDF
Scala intro workshop
PDF
Scala or functional programming from a python developer's perspective
PDF
Fp in scala part 2
PDF
FP in scalaで鍛える関数型脳
PDF
Transform your State \/ Err
Scala Hands On!!
Monad Transformers - Part 1
Functional programming in scala
Send + More = Money – Let’s mash 2 monads to solve a simple CSP
Scala 101
High Wizardry in the Land of Scala
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
A Prelude of Purity: Scaling Back ZIO
学生向けScalaハンズオンテキスト
The Essence of the Iterator Pattern (pdf)
Thesis PPT
Thesis
The Essence of the Iterator Pattern
Introduction to Monads in Scala (2)
Demystifying functional programming with Scala
Scala intro workshop
Scala or functional programming from a python developer's perspective
Fp in scala part 2
FP in scalaで鍛える関数型脳
Transform your State \/ Err

Recently uploaded (20)

PPTX
Tartificialntelligence_presentation.pptx
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
Big Data Technologies - Introduction.pptx
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PPTX
Machine Learning_overview_presentation.pptx
PDF
Getting Started with Data Integration: FME Form 101
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Electronic commerce courselecture one. Pdf
Tartificialntelligence_presentation.pptx
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
Digital-Transformation-Roadmap-for-Companies.pptx
Group 1 Presentation -Planning and Decision Making .pptx
MYSQL Presentation for SQL database connectivity
SOPHOS-XG Firewall Administrator PPT.pptx
Dropbox Q2 2025 Financial Results & Investor Presentation
Spectral efficient network and resource selection model in 5G networks
20250228 LYD VKU AI Blended-Learning.pptx
Network Security Unit 5.pdf for BCA BBA.
Big Data Technologies - Introduction.pptx
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
MIND Revenue Release Quarter 2 2025 Press Release
Machine Learning_overview_presentation.pptx
Getting Started with Data Integration: FME Form 101
Mobile App Security Testing_ A Comprehensive Guide.pdf
NewMind AI Weekly Chronicles - August'25-Week II
The Rise and Fall of 3GPP – Time for a Sabbatical?
Electronic commerce courselecture one. Pdf

Scalaエンジニアのためのモナド入門

  • 4. • → Haskell • Scala → List Option map flatMap for • → 4
  • 8. val addTwo:Int=>Int = a => { a+2 } val addTwoThree = addTwo(3) println(addTwoThree) // 5 println(addTwoThree) // 5 ↓ ↓ println(addTwo(3)) // 5 println(addTwo(3)) // 5 8
  • 10. val acc=Array(0) val addTwo:Int=>Int = a => { acc(0) = acc(0)+a+2 acc(0) } val addTwoThree = addTwo(3) println(addTwoThree) // 5 println(addTwoThree) // 5 ↓ ↓ println(addTwo(3)) // 5 println(addTwo(3)) // 10 10
  • 13. 13
  • 15. 15
  • 17. • List Option IO State • → 17
  • 19. • → • → A => M[B] • → M[A] >>= (A => M[B]) → x >>= f = ??? → ??? >>= → flatMap 19 Int=>List[String] List[String] >>= (String=>List[Int])
  • 20. • Option → None None Some(4).flatMap(a=>(Some(3).flatMap(b=>Some(a*b)))) // Some(12) Some(4).flatMap(a=>((None:Option[Int]).flatMap(b=>Some(a*b)))) // None • List → List(1,2,3).flatMap(a=>(List(4,5,6).flatMap(b=>List(a*b)))) // List(4, 5, 6, 8, 10, 12, 12, 15, 18) • State → 20 flatMap
  • 21. val om = for { a <- Some(4) b <- None:Option[Int] } yield (a*b) // None val lm = for { a <- List(1,2,3) b <- List(4,5,6) } yield (a*b) // List(4, 5, 6, 8, 10, 12, 12, 15, 18) 21 for
  • 22. (A => M[B]) >>= (B => M[C]) >>= (C => M[D]) → A => M[D] → val lm = (x:Int) => for { a <- List(1,2,3).map(_*x) b <- List(4,5,6).map(_*a) } yield b lm(2) // List(8, 10, 12, 16, 20, 24, 24, 30, 36) 22 List
  • 24. 24
  • 25. • • IO Reader Writer • 25 State
  • 26. • A => S => (B,S) B => S => (C,S) C => S => (D,S) • A => M[B] B => M[C] C => M[D] → (A => M[B]) >>= (B => M[C]) >>= (C => M[D]) → State[S,A] >>= (A => State[S,B]) → flatMap 26
  • 27. case class State[S,A](runState: S => (A,S)) { def flatMap[B]:(A=>State[S,B])=>State[S,B] = f => State(s => { val (a,s1) = this.runState(s) f(a).runState(s1) }) def map[B]:(A=>B)=>State[S,B] = f => flatMap(a=>State.unit(f(a))) } case object State { def unit[S,A]:A=>State[S,A] = a => State(s => (a,s)) } 27 flatMap
  • 29. val push:Int=>State[List[Int],Unit] = a => State(s => ((), a::s)) val pop:State[List[Int],Int] = State(s => (s.head, s.tail)) val calc:(Int=>Int=>Int)=>State[List[Int],Unit] = f => { for { a <- pop b <- pop _ <- push (f(a)(b)) } yield () } val plus:Int=>Int=>Int = a => b => b+a val minus:Int=>Int=>Int = a => b => b-a val mult:Int=>Int=>Int = a => b => b*a val div:Int=>Int=>Int = a => b => b%a 29
  • 30. // 2 3 + 4 1 - * = (2+3)*(4-1) val dc = for { _ <- push (2) _ <- push (3) _ <- calc (plus) _ <- push (4) _ <- push (1) _ <- calc (minus) _ <- calc (mult) } yield () dc.runState(List.empty) 30
  • 32. case class Parser[S,A](runParser: S => Option[(A,S)]) { def flatMap[B]:(A=>Parser[S,B])=>Parser[S,B] = f => Parser(s => { val o = this.runParser(s) o.flatMap{ case (a,s1) => f(a).runParser(s1) } }) def map[B]:(A=>B)=>Parser[S,B] = f => flatMap(a=>Parser.unit(f(a))) } case object Parser { def unit[S,A]:A=>Parser[S,A] = a => Parser(s => Some((a,s))) } 32 flatMap
  • 34. val item:Parser[String,Char] = { Parser(s => if (s.length > 0) { Some((s.head, s.tail)) } else { None }) } val satisfy:(Char=>Boolean)=>Parser[String,Char] = f => { for { c <- item n <- Parser(s => if (f(c)) { Some((c,s)) } else { None }):Parser[String,Char] } yield n } val char:Char=>Parser[String,Char] = c => satisfy((x:Char)=>x==c) val digit:Parser[String,Char] = satisfy((x:Char)=>x.isDigit) val letter:Parser[String,Char] = satisfy((x:Char)=>x.isLetter) 34
  • 35. val p = for { a <- letter b <- char(a) c <- digit d <- digit e <- digit f <- digit } yield List(a,b,c,d,e,f).mkString p.runParser(“AA0123") // Some(“AA0123”,) p.runParser(“AB0123") // None p.runParser("A90123") // None p.runParser("990123") // None 35
  • 39. 39