Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Introduction to functional programming
Search
Shigeki Shoji
September 14, 2022
Technology
0
220
Introduction to functional programming
Shigeki Shoji
September 14, 2022
Tweet
Share
More Decks by Shigeki Shoji
See All by Shigeki Shoji
Instructional Designer
takesection
0
100
Zero to Hero
takesection
0
170
Fargateを使った研修の話
takesection
0
220
20240730_kanjava.pdf
takesection
0
130
JavaのJCP会員になろう
takesection
0
88
JAWS-UG Okayama 2024 LT
takesection
0
79
IaCツールのいろいろ
takesection
0
360
依存ライブラリはどこに?
takesection
0
270
GitHub Actions Runner Controller
takesection
0
340
Other Decks in Technology
See All in Technology
AI・LLM事業部のSREとタスクの自動運転
shinyorke
PRO
0
300
OPENLOGI Company Profile for engineer
hr01
1
22k
モンテカルロ木探索のパフォーマンスを予測する Kaggleコンペ解説 〜生成AIによる未知のゲーム生成〜
rist
4
1.1k
17年のQA経験が導いたスクラムマスターへの道 / 17 Years in QA to Scrum Master
toma_sm
0
410
技術好きなエンジニアが _リーダーへの進化_ によって得たものと失ったもの / The Gains and Losses of a Tech-Enthusiast Engineer’s “Evolution into Leadership”
kaminashi
0
210
Go製のマイグレーションツールの git-schemalex の紹介と運用方法
shinnosuke_kishida
1
410
Amazon EKS Auto ModeでKubernetesの運用をシンプルにする
sshota0809
0
110
Tirez profit de Messenger pour améliorer votre architecture
tucksaun
1
150
年末調整プロダクトの内部品質改善活動について
kaomi_wombat
0
210
ソフトウェアプロジェクトの成功率が上がらない原因-「社会価値を考える」ということ-
ytanaka5569
0
130
サーバシステムを無理なくコンテナ移行する際に伝えたい4つのポイント/Container_Happy_Migration_Method
ozawa
1
100
OPENLOGI Company Profile
hr01
0
61k
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
177
52k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Facilitating Awesome Meetings
lara
53
6.3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
22
2.6k
How to Think Like a Performance Engineer
csswizardry
22
1.5k
Optimising Largest Contentful Paint
csswizardry
35
3.2k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
2.9k
Why Our Code Smells
bkeepers
PRO
336
57k
Agile that works and the tools we love
rasmusluckow
328
21k
It's Worth the Effort
3n
184
28k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.5k
Bash Introduction
62gerente
611
210k
Transcript
関数型プログラミング超入門 Shigeki Shoji @takesection 2022-09-14
ゴール Functional Programming (関数型プログラミング) の土台となるコンセプトを理解する 2
目次 Referential Transparency (参照透過性) Immutable (不変性) Side Effect (副作用) Higher-order
Function (高階関数) Map、Filter、Reduce 3
Referential Transparency (参照透過性) 参照透過性とは、「プログラムの構成要素が同じもの同士は等しい」ということです。 例えば: 1 と 1 は等しい 文字列
abc と文字列 abc は等しい 関数 f(1) と 関数 f(1) は等しい つまり、変数 a と b に同じ値 (1 や abc や f(1)) を代入しているなら、a と b は等しいという ことになります。 4
参照透過性の利点 (An advantage of referential transparency) 参照透過性の利点は、数学的推論が利用できることです。f(1) の計算結果は常に f(1) の計算結
果と等しいため、その時の状況によって結果が変わらないため、テストが容易になります。 5
Immutable (不変性) 構造化/手続き型/ 命令型プログラミングでは、次の例のように、変数をミュータブルに使用す るのが一般的です。 int sum = 0; for
(int x: list) sum = sum + x; 変数 sum、x の値はプログラムの実行中に値を変化させます。これは、参照透過性の破壊を 意味します。 関数型プログラミングでは、イミュータブルな変数を利用することが一般的です。 6
Side Effect (副作用) 関数がファイルやデータベース、ネットワーク等外部との入出力に依存している場合、外部 環境の変化により関数の結果が変化することがあります。このような作用を「副作用」と呼 びます。副作用もまた参照透過性の破壊に繋がります。 この副作用を伴わずに参照透過性を持つ関数を「純粋な関数」と呼びます。 関数型プログラミングで、副作用を伴う関数を定義する場合、副作用を特定の関数内に隔離 することがベストプラクティスになります。 7
Higher-order Function (高階関数) 高階関数とは、簡単にいうと引数に関数を、あるいは関数を返す関数です。 次の例は、Javaによる高階関数を定義する例です。Optional.map() は引数が関数 (Function) です。関数には、次のようにラムダ関数も使用できます: Optional<Integer> maybeId
= Optional.ofNullable(1); maybeId.map(id -> { System.out.println(id); return id; }); 8
Map、Filter、Reduce ここで説明する Map、Filter、Reduce はコレクションやストリームを扱う高階関数を使うパ ターンです。 map(f) は、要素の型を変換する関数が引数になります。元の型 E を変換後の型 F
にしま す。 filter(f) は、要素の値を評価して通過させる場合は true、破棄する場合は false を返す関 数が引数になります。 reduce(f) は、コレクションやストリームの要素の合計値を求めるというような計算に使 用します。引数は要素の値を使って集計する関数になります。 val seq = Seq("1", "2", "3", "2", "2", "4") seq.map(_.toInt).filter(_ == 2).reduce((x, y) => x + y) 9
method と function の違い C++ や Java ではオブジェクトにフィールド (field) やメソッド
(method) を定義します。 method はオブジェクトの field を使用するロジックを記述します。 ロジックは、基本的には上のステートメントから下のステートメントに順番に実行され、ル ープによって上のステートメントに戻ったり、条件文によって、特定のコードブロックが実 行される、手法 (method) を記述します。 対して、関数 (function) は式 (formula) を定義します。 10
Scala の Option の使い方 Option[T] は None か Some(T) のいずれかになります。
val maybeId: Option[Integer] = Option(1) // or Some(1) maybeId.map { id => System.out.println(id); id; } 11
Scala の Either の使い方 Either[L, R] は Left(L) か Right(R)
のいずれかになります。 import java.io._ val line: Either[IOException, String] = Right("abc") line.map { l => System.out.println(l); l; } 12
Scala の Try の使い方 Try[+T] は Success(T) か Failure(E) のいずれかになります。
import scala.util.Try Try("123").map(_.toInt) 13