Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
TIS Inc.
3,086 views
再帰で脱Javaライク
「実戦での Scala 〜 6つの事例から知る Scala の勘所〜」でLTしました。
Engineering
◦
Read more
5
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 30
2
/ 30
3
/ 30
4
/ 30
5
/ 30
6
/ 30
7
/ 30
8
/ 30
9
/ 30
10
/ 30
11
/ 30
12
/ 30
13
/ 30
14
/ 30
15
/ 30
16
/ 30
17
/ 30
18
/ 30
19
/ 30
20
/ 30
21
/ 30
22
/ 30
23
/ 30
24
/ 30
25
/ 30
26
/ 30
27
/ 30
28
/ 30
29
/ 30
30
/ 30
More Related Content
PDF
Typesafe Reactive Platformで作るReactive System入門
by
TIS Inc.
PDF
Typesafe Reactive Platformで作るReactive System
by
TIS Inc.
PDF
10分で分かるリアクティブシステム
by
TIS Inc.
PDF
AWS Ops系サービスが更に便利になる中、それでもなおZabbixとセットで考えたほうが良いのか?
by
Daisuke Ikeda
PDF
Cloud Days Tokyo 2015 "オンプレミス環境のクラウド化と運用を楽にする OpenStack ソリューション ~ハイブリッド・クラウドを...
by
Shinichiro Arai
PDF
Spring social の基礎
by
Takuya Iwatsuka
PDF
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
by
Daisuke Ikeda
PDF
リアクティブシステムとAkka
by
TIS Inc.
Typesafe Reactive Platformで作るReactive System入門
by
TIS Inc.
Typesafe Reactive Platformで作るReactive System
by
TIS Inc.
10分で分かるリアクティブシステム
by
TIS Inc.
AWS Ops系サービスが更に便利になる中、それでもなおZabbixとセットで考えたほうが良いのか?
by
Daisuke Ikeda
Cloud Days Tokyo 2015 "オンプレミス環境のクラウド化と運用を楽にする OpenStack ソリューション ~ハイブリッド・クラウドを...
by
Shinichiro Arai
Spring social の基礎
by
Takuya Iwatsuka
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
by
Daisuke Ikeda
リアクティブシステムとAkka
by
TIS Inc.
What's hot
PPTX
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
by
Jiro Hiraiwa
PDF
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
by
Daisuke Ikeda
PPTX
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
by
光平 八代
PPTX
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
by
光平 八代
PDF
可用性を突き詰めたリアクティブシステム
by
TIS Inc.
PDF
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
by
softlayerjp
PPTX
Spring I/O 2015 報告
by
Takuya Iwatsuka
PDF
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
by
Hinemos
PDF
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
by
Hinemos
PDF
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
by
Daisuke Ikeda
PDF
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
by
Daisuke Ikeda
PDF
Spring I/O 2017 報告 ThymeleafのWebFlux対応
by
Takuya Iwatsuka
PDF
AZAREA-Clusterセミナー(クラウドEXPO2013春)
by
AzareaCluster
PPTX
20210427_Introducing_X-TechJAWS
by
Typhon 666
PDF
バッチソリューションAzarea cluster 2016
by
AzareaCluster
PDF
170311 JAWS days 2017 fintech
by
Toshihide Atsumi
PDF
OpenStack環境の継続的インテグレーション
by
エクイニクス・ジャパン
PDF
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
by
エクイニクス・ジャパン
PPTX
アメーバブログを支えるデータセンターとインフラ技術
by
Hiroki NAKASHIMA
PPTX
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
by
エクイニクス・ジャパン
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
by
Jiro Hiraiwa
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
by
Daisuke Ikeda
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
by
光平 八代
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
by
光平 八代
可用性を突き詰めたリアクティブシステム
by
TIS Inc.
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
by
softlayerjp
Spring I/O 2015 報告
by
Takuya Iwatsuka
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
by
Hinemos
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
by
Hinemos
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
by
Daisuke Ikeda
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
by
Daisuke Ikeda
Spring I/O 2017 報告 ThymeleafのWebFlux対応
by
Takuya Iwatsuka
AZAREA-Clusterセミナー(クラウドEXPO2013春)
by
AzareaCluster
20210427_Introducing_X-TechJAWS
by
Typhon 666
バッチソリューションAzarea cluster 2016
by
AzareaCluster
170311 JAWS days 2017 fintech
by
Toshihide Atsumi
OpenStack環境の継続的インテグレーション
by
エクイニクス・ジャパン
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
by
エクイニクス・ジャパン
アメーバブログを支えるデータセンターとインフラ技術
by
Hiroki NAKASHIMA
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
by
エクイニクス・ジャパン
Viewers also liked
PDF
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
by
Yuta Okamoto
PPT
実戦でのScala LT 2015.2.21
by
Junichi Okamura
PDF
Rx入門
by
Takaaki Suzuki
PDF
Scala が支える医療系ウェブサービス #jissenscala
by
Kazuhiro Sera
PDF
Reactive extensions入門v0.1
by
一希 大田
PDF
Scala@SmartNews_20150221
by
Shigekazu Takei
PDF
Scala@SmartNews AdFrontend を Scala で書いた話
by
Keiji Muraishi
PDF
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
by
takezoe
PDF
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
by
LINE Corporation
PPTX
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
PPTX
Reactive Programming in Java 8 with Rx-Java
by
Kasun Indrasiri
PDF
なぜリアクティブは重要か #ScalaMatsuri
by
Yuta Okamoto
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
by
Yuta Okamoto
実戦でのScala LT 2015.2.21
by
Junichi Okamura
Rx入門
by
Takaaki Suzuki
Scala が支える医療系ウェブサービス #jissenscala
by
Kazuhiro Sera
Reactive extensions入門v0.1
by
一希 大田
Scala@SmartNews_20150221
by
Shigekazu Takei
Scala@SmartNews AdFrontend を Scala で書いた話
by
Keiji Muraishi
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
by
takezoe
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
by
LINE Corporation
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
Reactive Programming in Java 8 with Rx-Java
by
Kasun Indrasiri
なぜリアクティブは重要か #ScalaMatsuri
by
Yuta Okamoto
Similar to 再帰で脱Javaライク
PDF
関数プログラミング入門
by
Hideyuki Tanaka
PDF
Hokuriku Scala 1
by
NISHIMOTO Keisuke
PDF
関数型軽い紹介
by
Daniel Perez
PDF
磯野ー!関数型言語やろうぜー!
by
Ra Zon
PDF
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
by
Ouka Yuka
PDF
たのしい関数型
by
Shinichi Kozake
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
PDF
関数プログラミング ことはじめ (再)
by
Suguru Hamazaki
PDF
ATN No.2 Scala事始め
by
AdvancedTechNight
PDF
命令プログラミングから関数プログラミングへ
by
Naoki Kitora
PDF
15分でざっくり分かるScala入門
by
SatoYu1ro
PDF
Functional Way
by
Kent Ohashi
PDF
関数プログラミングことはじめ
by
Naoki Kitora
PDF
20121222 scalaビギナーズ
by
Asami Abe
PDF
Robot Language and a Tail Recursive Interpreter
by
たけおか しょうぞう
PDF
Kink: invokedynamic on a prototype-based language
by
Taku Miyakawa
PDF
プログラミング言語Scala
by
TanUkkii
PDF
Material
by
_TUNE_
関数プログラミング入門
by
Hideyuki Tanaka
Hokuriku Scala 1
by
NISHIMOTO Keisuke
関数型軽い紹介
by
Daniel Perez
磯野ー!関数型言語やろうぜー!
by
Ra Zon
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
by
Ouka Yuka
たのしい関数型
by
Shinichi Kozake
BOF1-Scala02.pdf
by
Hiroshi Ono
BOF1-Scala02.pdf
by
Hiroshi Ono
BOF1-Scala02.pdf
by
Hiroshi Ono
関数プログラミング ことはじめ (再)
by
Suguru Hamazaki
ATN No.2 Scala事始め
by
AdvancedTechNight
命令プログラミングから関数プログラミングへ
by
Naoki Kitora
15分でざっくり分かるScala入門
by
SatoYu1ro
Functional Way
by
Kent Ohashi
関数プログラミングことはじめ
by
Naoki Kitora
20121222 scalaビギナーズ
by
Asami Abe
Robot Language and a Tail Recursive Interpreter
by
たけおか しょうぞう
Kink: invokedynamic on a prototype-based language
by
Taku Miyakawa
プログラミング言語Scala
by
TanUkkii
Material
by
_TUNE_
More from TIS Inc.
PDF
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
by
TIS Inc.
PDF
Reactive Systems that focus on High Availability with Lerna
by
TIS Inc.
PDF
Starting Reactive Systems with Lerna #reactive_shinjuku
by
TIS Inc.
PDF
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
by
TIS Inc.
PDF
Akkaの並行性
by
TIS Inc.
PDF
JavaからAkkaハンズオン
by
TIS Inc.
PDF
Akka in Action workshop #ScalaMatsuri 2018
by
TIS Inc.
PDF
Preparing for distributed system failures using akka #ScalaMatsuri
by
TIS Inc.
PDF
Akkaで実現するステートフルでスケーラブルなアーキテクチャ
by
TIS Inc.
PDF
akka-doc-ja
by
TIS Inc.
PDF
Effective Akka読書会2
by
TIS Inc.
PDF
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
by
TIS Inc.
PDF
甲賀流Jenkins活用術
by
TIS Inc.
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
by
TIS Inc.
Reactive Systems that focus on High Availability with Lerna
by
TIS Inc.
Starting Reactive Systems with Lerna #reactive_shinjuku
by
TIS Inc.
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
by
TIS Inc.
Akkaの並行性
by
TIS Inc.
JavaからAkkaハンズオン
by
TIS Inc.
Akka in Action workshop #ScalaMatsuri 2018
by
TIS Inc.
Preparing for distributed system failures using akka #ScalaMatsuri
by
TIS Inc.
Akkaで実現するステートフルでスケーラブルなアーキテクチャ
by
TIS Inc.
akka-doc-ja
by
TIS Inc.
Effective Akka読書会2
by
TIS Inc.
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
by
TIS Inc.
甲賀流Jenkins活用術
by
TIS Inc.
再帰で脱Javaライク
1.
Copyright © 2014
TIS Inc. All rights reserved. 再帰で 脱Javaライク 2015.2.21 TIS株式会社 前出祐吾
2.
Copyright © 2014
TIS Inc. All rights reserved. 2 自己紹介 TIS株式会社 戦略技術センター! 社内向けエンジニア基盤の整備 ▶ Scalaの活用検証! 甲賀忍者! 東京デビュー(先月)! @yugolf
3.
Copyright © 2014
TIS Inc. All rights reserved. 3 Scalaってどうなの? コード量が半分くらいに! ! とはいえ、Scalaって難しいんじゃないの? ! 大丈夫、Javaのライブラリ呼べるし、Javaライクにも書ける し。 (その場合、コード量は半分にならないけど。。) ! ん!?
4.
Copyright © 2014
TIS Inc. All rights reserved. 4 脱Javaライクしてファ ンクショナルなプロ グラマーになるんです。
5.
Copyright © 2014
TIS Inc. All rights reserved. 5 Javaライクってなんですの? 例:総和 1からnまでを全部足す。 ! (めいっ ぱい、 Javaっぽ く足す) def sowa(value: Int): Int ={ var result = 0; for(n <-‐ 1 to value) { result = result + n; } return result; } ! sowa(10) //> res4: Int = 55
6.
Copyright © 2014
TIS Inc. All rights reserved. 6 脱Javaライク varはやめよう。 forループもやめよう。 再帰にしよう。 ①終了条件 ②自分呼出 ③計算
7.
Copyright © 2014
TIS Inc. All rights reserved. 7 再帰にしよう:ステップ① def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ①終了条件 ②自分呼出 ③計算 計算対象の数値が0に なったとき
8.
Copyright © 2014
TIS Inc. All rights reserved. 8 再帰にしよう:ステップ② def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ①終了条件 ②自分呼出 ③計算 自分()
9.
Copyright © 2014
TIS Inc. All rights reserved. 9 再帰にしよう:ステップ③ def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ①終了条件 ②自分呼出 ③計算 対象値 + 自分()
10.
Copyright © 2014
TIS Inc. All rights reserved. 10 再帰にしよう:実行1 def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ①終了条件 ②自分呼出 ③計算 sowa(10) //> res6: Int = 55
11.
Copyright © 2014
TIS Inc. All rights reserved. 11 再帰にしよう:実行2 def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) sowa(100000) //> java.lang.StackOverflowError //| at Demo$$anonfun$main$1.sowa$1(Demo.scala:64) //| at Demo$$anonfun$main$1.sowa$1(Demo.scala:64) //| at Demo$$anonfun$main$1.sowa$1(Demo.scala:64) ①終了条件 ②自分呼出 ③計算
12.
Copyright © 2014
TIS Inc. All rights reserved. 12 スタックオーバーフロー!? スタックのサイズを大きくする? (-Xss) ! スタックの消費量を減らそう!
13.
Copyright © 2014
TIS Inc. All rights reserved. 13 スタックオーバーフロー対策 末尾再帰で最適化 ! ! ! ! 自分を呼び出したあとに計算(足し算)するのではなく、 計算したものを引数として、その結果を蓄積する。 ! 戻ってきたあとに計算がなく、呼出し元に戻るだけ。 def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1)
14.
Copyright © 2014
TIS Inc. All rights reserved. 14 末尾再帰 アキュムレータ (accumulator) 自分を呼び出したあとに計算(足し算)するのではなく、 計算したものを引数として、その結果を蓄積する。 + 3 = + 2 = + 1 =
15.
Copyright © 2014
TIS Inc. All rights reserved. 15 末尾再帰 アキュムレータ (accumulator) 自分を呼び出したあとに計算(足し算)するのではなく、 計算したものを引数として、その結果を蓄積する。 ①終了条件 ②自分呼出 ③アキュムレータ による計算
16.
Copyright © 2014
TIS Inc. All rights reserved. 16 末尾再帰にしよう:ステップ① def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) 計算対象の数値が0に なったとき ①終了条件 ②自分呼出 ③アキュムレータ による計算
17.
Copyright © 2014
TIS Inc. All rights reserved. 17 末尾再帰にしよう:ステップ② def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) 自分() ①終了条件 ②自分呼出 ③アキュムレータ による計算
18.
Copyright © 2014
TIS Inc. All rights reserved. 18 末尾再帰にしよう:ステップ③ def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) 対象値 + アキュム レータ ①終了条件 ②自分呼出 ③アキュムレータ による計算
19.
Copyright © 2014
TIS Inc. All rights reserved. 19 末尾再帰にしよう:実行 def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) sowa(100000) //> res4: Long = 705082704 ①終了条件 ②自分呼出 ③アキュムレータ による計算
20.
Copyright © 2014
TIS Inc. All rights reserved. 20 逆アセンブル public final int sowa(int); Code: 0: iload_1 1: iconst_0 2: if_icmpne 9 5: iload_1 6: goto 18 9: iload_1 10: aload_0 11: iload_1 12: iconst_1 13: isub 14: invokevirtual #101 // Method sowa2:(I)I 17: iadd 18: ireturn public final int sowa(int, int); Code: 0: iload_1 1: iconst_0 2: if_icmpne 7 5: iload_2 6: ireturn 7: iload_1 8: iconst_1 9: isub 10: iload_1 11: iload_2 12: iadd 13: istore_2 14: istore_1 15: goto 0 ただの再帰 末尾再帰
21.
Copyright © 2014
TIS Inc. All rights reserved. 21 逆コンパイル public final int sowa(int value) { return value != 0 ? value + sowa(value - 1) : value; } def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ただの再帰
22.
Copyright © 2014
TIS Inc. All rights reserved. 22 逆コンパイル public final int sowa(int value, int acc) { do { if (value == 0) return acc; acc = value + acc; value = value - 1; } while (true); } def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value -‐ 1, value + acc) 最適 化!! 末尾再帰
23.
Copyright © 2014
TIS Inc. All rights reserved. 23 tailrecアノテーション 末尾再帰になっていないメソッドの検出 import scala.annotation.tailrec @tailrec final def sowa(value: Int): Int = if (value == 0) value else value + sowa(value -‐ 1) could not optimize @tailrec annotated method sowa: it contains a recursive call not in tail position
24.
Copyright © 2014
TIS Inc. All rights reserved. 24 上書き禁止 @tailrec def sowa(value: Int, acc: Int = 0): Int = if (value == 0) acc else sowa(value -‐ 1, value + acc) @tailrec final def sowa(value: Int,… could not optimize @tailrec annotated method sowa: it is neither private nor final so can be overridden overrideしてメソッドを変更出来ないようにfinalにする privateにするか ローカルメソッドにしてもOK
25.
Copyright © 2014
TIS Inc. All rights reserved. 25 総和 def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ノーアキュム @tailrec final def sowa(value: Int, acc: Int = 0): Int = if (value == 0) acc else sowa(value -‐ 1, value + acc) アキュム
26.
Copyright © 2014
TIS Inc. All rights reserved. 26 !(階乗) def factorial(value: Int): Int = if (value == 0) 1 else value * factorial(value -‐ 1) @tailrec final def factorial(value: Int, acc: Long): Long = if (value == 0) acc else factorial(value - 1, value * acc) ノーアキュム アキュム
27.
Copyright © 2014
TIS Inc. All rights reserved. 27 (おまけ)関数(計算式)を引数に def calculate[A](value: Int, acc: A, func: (Int, A) => A): A = { def calculate(value: Int, acc: A): A = if (value == 0) acc else calculate(value - 1, func(value, acc)) calculate(value, acc) } ! def factorial(value: Int) = calculate(value, 1L, (v: Int, acc: Long) => v * acc) ! def sowa(value: Int) = calculate(value, 0, (v: Int, acc: Int) => v + acc) 計算(たすか かけるか) 型(Int か Longか) 階乗 総和
28.
Copyright © 2014
TIS Inc. All rights reserved. 28 まとめ:脱Javaライクの第一歩 再帰で関数型プログラミング アキュムレータで末尾再帰 @tailrecで末尾かチェック ! 注) 間接的な再帰は最適化されません。
29.
Copyright © 2014
TIS Inc. All rights reserved. 29 よくわからなかった、という方は スライドの最初に再帰してくださ い。(コップ本より) まとめ:脱Javaライクの第一歩
30.
THANK YOU
Download