Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Scalaはいいぞ
Search
kokoroszk
May 18, 2026
54
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Scalaはいいぞ
kokoroszk
May 18, 2026
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
28
2.9k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
220
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
950
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
Designing Experiences People Love
moore
143
24k
The Curse of the Amulet
leimatthew05
3
16k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Practical Orchestrator
shlominoach
192
12k
Speed Design
sergeychernyshev
33
2.2k
Automating Front-end Workflow
addyosmani
1369
210k
Transcript
Scala はいいぞ flatMap とZIO が描く宣言的な設計図 鈴木 心 (@kokoroszk)
自己紹介 株式会社ヌーラボ 鈴木 心 (@kokoroszk) Scala で求人を探して転職して4 年目 入社後、主にTypeScript とRust
を書いています(!? ) 趣味: 音楽、調味料 勉強会で登壇するのは初めてです! Scala はいいぞ 2
雑談: Scala の好きなところ Scala はいいぞ 3
雑談: Scala の好きなところ 特殊な構文が少ない Typescript の場合 // 配列の処理で特殊な記号[] を使う const
arr = [1, 2, 3]; // 配列を生成する特殊な記号[] arr[1]; // 要素にアクセスする特殊な記号[] // 四則演算に特殊な記号+,-,*,/ を使う 1 + 2; // 加算を行う特殊な記号 + // 値を返す条件式に特殊な記号 ? : を使う const result = x > 10 ? "large" : "small"; Scala はいいぞ 4
雑談: Scala の好きなところ 特殊な構文が少ない Scala の場合 // apply メソッドの呼び出し。apply メソッドは関数名の省略が可能。
val list = List(1, 2, 3) // List.apply(1, 2, 3) list(1) // list.apply(1) // + メソッドの呼び出し。ドットはスペースに置換可能、引数の() も省略可能 1 + 2 // 1.+(2) // 全ての文が式であり、値を返す val result = if (x > 10) "large" else "small" Scala はいいぞ 5
雑談: Scala の好きなところ 構文の例外が少なく、一貫したルールの上に成り立っている。 Rust の場合 let list = vec![Some(1),
None, Some(2)]; // パターンマッチは match キーワードで開始する let matched = match &list[..] { [head, ..] => head, [] => None, } // map メソッドに渡す場合、クロージャの中で match を使う。 let mapped: Vec<i32> = list.into_iter().map(|x| match x { Some(v) => v * 2, None => 0, }).collect(); Scala はいいぞ 6
雑談: Scala の好きなところ 構文の例外が少なく、一貫したルールの上に成り立っている。 Scala の場合 val list = List(Some(1),
None, Some(2)) // パターンマッチ(メソッド呼び出しではないが) val matched = list match { case head :: tail => head case Nil => None } // match とメソッド呼び出しが同じ見た目 val mapped = list map { case Some(v) => v * 2 case None => 0 } Scala はいいぞ 7
雑談: Scala の好きなところ 機能が豊富。大体なんでもできるはず。 メソッド拡張(implicit) アドホック多相(implicit) 暗黙の型変換(implicit) 型を柔軟に定義できる mixin, enum,
union type, intersection type, opaque type... 遅延評価(lazy val, def), macro などなど... Scala はいいぞ 8
雑談: Scala の好きなところ 機能が豊富。大体なんでもできるはず。 メソッド拡張(extension) アドホック多相(given/using) 暗黙の型変換( Conversion インスタンスのgiven/using) 型を柔軟に定義できる
mixin, enum, union type, intersection type, opaque type... 遅延評価(lazy val, def), macro などなど... Scala はいいぞ 9
本題: Scala のいいところ flatMap の話をします 値を引き継いで処理しながら、値だけではなく構造に干渉できる仕組み // M[A] のメソッドとしてのflatMap def
flatMap[B](f: A => M[B]): M[B] // List の場合 // 初めは長さ3 のリストだが、長さ6 のリストになった List(1, 2, 3).flatMap(i => List(i, i*2)) // Option の場合 (Some / None) // 初めはSome= 値があるが、途中でNone= 値なしになった Some(1).flatMap(i => None).flatMap(i => Some(i.toString)) // 結果は None // Either の場合 (Right / Left) // 初めはRight= 成功だが、途中でLeft= 失敗になった Right(1).flatMap(i => Left("err")).flatMap(i => Right(i*2)) // 結果は Left("err") Scala はいいぞ 10
本題: Scala のいいところ for 式: 連続したflatMap をフラットに書ける // flatMap が連続するとネストがつらいよ
val manager1: Option[Manager] = findUser("id-123").flatMap { user => findDepartment(user.deptId).flatMap { dept => findManager(dept.managerId).map { manager => manager } } } // for 式を使った、正常系だけが縦に並ぶ仕様書のような記述 val manager2: Option[Manager] = for { user <- findUser("id-123") dept <- findDepartment(user.deptId) // flatMap manager <- findManager(dept.managerId) // flatMap } yield manager // map Scala はいいぞ 11
本題: Scala のいいところ 関数も引数・エラー・戻り値をもつ構造 連続する関数呼び出しは、前の成功値を引き継いで行う つまり関数オブジェクトにflatMap があれば、依存やエラーの構造を合成できるので は... Scala はいいぞ
12
本題: Scala のいいところ(ZIO ) flatMap 、あります! // 実行時にR を要求して //
失敗の場合はE を返し // 成功の場合はA を返却する // ノンブロッキングな軽量スレッドで実行される関数オブジェクト val program: ZIO[R, E, A] // Option, Either, Future もお手軽にZIO として扱えます val fromOption = ZIO.fromOption(Some("ZIO")) val fromEither = ZIO.fromEither(Right("ZIO")) val fromFuture = ZIO.fromFuture(implicit ec => scala.concurrent.Future("ZIO")) Scala はいいぞ 13
本題: Scala のいいところ(ZIO ) // 複数のZIO を定義する def getUser(id: String):
ZIO[Database, DBError, User] = ??? def getTasks(user: User): ZIO[TaskApi, ApiError, List[Task]] = ??? // ZIO を合成する def getActiveUserTasks(userId: String): ZIO[Database & TaskApi, DBError | ApiError, List[Task]] = for { user <- getUser(userId) tasks <- getTasks(user) } yield tasks // 全てのZIO のR, E が合わさったZIO が返却される // ZIO を実行する def executeProgram() = { val runnable: ZIO[Any, DBError | ApiError, List[Task]] = getActiveUserTasks("id-123") .provide(Database.instance, TaskApi.instance) .catchAll { case dbError: DBError => ??? case apiError: ApiError => ??? } Unsafe.unsafe { implicit unsafe => Runtime.default.unsafe.run(runnable).getOrThrowFiberFailure() } } Scala はいいぞ 14
比べてみよう お題 ユーザー情報をDB から取得し、外部API からデータを取得する。 外部API アクセスは5 秒でタイムアウトさせ、失敗時はリトライする。 Scala はいいぞ
15
比べてみよう: Typescript Typescript の場合 class TaskService { constructor(private db: DB,
private api: Api) {} async getTasks(userId: string) { const user = await this.db.findUser(userId); if (!user) throw new UserNotFound(); try { return await withRetry( () => withTimeout(this.api.fetchTasks(user.id), 5000), 3 ); } catch (e: unknown) { if (e instanceof TimeoutError) throw e; throw new FetchError(e instanceof Error ? e.message : ''); } } Scala はいいぞ 16
比べてみよう: ZIO Scala の場合 def getTasks(userId: String) = for {
db <- ZIO.service[DB] // ZIO[DB, Nothing, DB] api <- ZIO.service[Api] // ZIO[DB & Api, Nothing, Api] // ZIO[DB & Api, DBError | UserNotFound, User] user <- db.findUser(userId).someOrFail(UserNotFound()) // ZIO[DB & Api, DBError | UserNotFound | FetchError | TimeoutError, List[Task]] tasks <- api.fetchTasks(user.id) .mapError(e => FetchError(e.getMessage)) .timeoutFail(TimeoutError())(5.seconds) .retry(Schedule.recurs(3)) } yield tasks Scala はいいぞ 17
これからのAI 時代において... 型付き言語の方がAI に優しいかというと、そうでもないらしい コードレビューもしない方がいい時代がそこまできているらしい とはいえ、仕様書的にざっくりどんな感じで動いてるかは把握したい... scala+ZIO なら依存やエラー、実行時の都合に影響されにくい関数が書けそうです Scala はいいぞ
18
Thank you! Scala 書きたいです Scala はいいぞ 19