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
230
Introduction to functional programming
Shigeki Shoji
September 14, 2022
Tweet
Share
More Decks by Shigeki Shoji
See All by Shigeki Shoji
Introduction to kanjava
takesection
0
89
LT Slide 2025-04-22
takesection
0
130
Instructional Designer
takesection
0
130
Zero to Hero
takesection
0
200
Fargateを使った研修の話
takesection
0
260
20240730_kanjava.pdf
takesection
0
150
JavaのJCP会員になろう
takesection
0
100
JAWS-UG Okayama 2024 LT
takesection
0
110
IaCツールのいろいろ
takesection
0
420
Other Decks in Technology
See All in Technology
激動の時代、新卒エンジニアはAIツールにどう向き合うか。 [LayerX Bet AI Day Countdown LT Day1 ツールの選択]
tak848
0
610
P2P ではじめる WebRTC のつまづきどころ
tnoho
1
270
興味の胞子を育て 業務と技術に広がる”きのこ力”
fumiyasac0921
0
290
【CEDEC2025】現場を理解して実現!ゲーム開発を効率化するWebサービスの開発と、利用促進のための継続的な改善
cygames
PRO
0
380
分散トレーシングによる コネクティッドカーのデータ処理見える化の試み
thatsdone
0
270
With Devin -AIの自律とメンバーの自立
kotanin0
2
810
解消したはずが…技術と人間のエラーが交錯する恐怖体験
lamaglama39
0
120
Turn Your Community into a Fundraising Catalyst for Black Philanthropy Month
auctria
PRO
0
200
手動からの解放!!Strands Agents で実現する総合テスト自動化
ideaws
3
390
「育てる」サーバーレス 〜チーム開発研修で学んだ、小さく始めて大きく拡張するAWS設計〜
yu_kod
1
190
大規模イベントを支える ABEMA の アーキテクチャ 変遷 2025
nagapad
5
520
Webの技術とガジェットで那須の子ども達にワクワクを! / IoTLT_20250720
you
PRO
0
130
Featured
See All Featured
Optimizing for Happiness
mojombo
379
70k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
283
13k
Facilitating Awesome Meetings
lara
54
6.5k
How STYLIGHT went responsive
nonsquared
100
5.7k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Become a Pro
speakerdeck
PRO
29
5.4k
The World Runs on Bad Software
bkeepers
PRO
70
11k
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