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
TanUkkii
11,956 views
ECMAScript6による関数型プログラミング
2014/10/29のES6+カジュアルトークで発表した資料です。
Engineering
◦
Read more
11
Save
Share
Embed
Embed presentation
Download
Downloaded 14 times
1
/ 19
2
/ 19
3
/ 19
4
/ 19
5
/ 19
6
/ 19
7
/ 19
8
/ 19
9
/ 19
10
/ 19
11
/ 19
12
/ 19
13
/ 19
14
/ 19
15
/ 19
16
/ 19
17
/ 19
18
/ 19
19
/ 19
More Related Content
PDF
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
by
Tomohiro Kumagai
PDF
JavaScriptユーティリティライブラリの紹介
by
Yusuke Hirao
PDF
これからのJavaScriptー関数型プログラミングとECMAScript6
by
TanUkkii
PDF
javascript を Xcode でテスト
by
Yoichiro Sakurai
PPTX
LINQ 概要 + 結構便利な LINQ to XML
by
ShinichiAoyagi
PDF
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
by
Masahiro Wakame
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
by
Masahiro Wakame
PDF
コンパイラ指向ReVIEW
by
Masahiro Wakame
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
by
Tomohiro Kumagai
JavaScriptユーティリティライブラリの紹介
by
Yusuke Hirao
これからのJavaScriptー関数型プログラミングとECMAScript6
by
TanUkkii
javascript を Xcode でテスト
by
Yoichiro Sakurai
LINQ 概要 + 結構便利な LINQ to XML
by
ShinichiAoyagi
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
by
Masahiro Wakame
ng-japan 2015 TypeScript+AngularJS 1.3
by
Masahiro Wakame
コンパイラ指向ReVIEW
by
Masahiro Wakame
What's hot
PPTX
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
by
YujiSoftware
PDF
TypeScript 言語処理系ことはじめ
by
Yu Nobuoka
PDF
React.jsでクライアントサイドなWebアプリ入門
by
spring_raining
PPTX
C# 7.2 with .NET Core 2.1
by
信之 岩永
PDF
asm.jsとWebAssemblyって実際なんなの?
by
Yosuke Onoue
PDF
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
by
schoowebcampus
PDF
はてなブックマーク in Scala
by
Lintaro Ina
PDF
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
by
なおき きしだ
PDF
なぜリアクティブは重要か #ScalaMatsuri
by
Yuta Okamoto
PDF
ScalaMatsuri 2016
by
Yoshitaka Fujii
PDF
覚醒!JavaScript
by
Haraguchi Go
PDF
TypeScript 1.0 オーバービュー
by
Akira Inoue
PDF
Async Enhancement
by
kamiyam .
PDF
これからのJavaScriptの話
by
Shogo Sensui
PPTX
モテる JavaScript
by
Osamu Monoe
PPTX
歌舞伎座Tech Rx会
by
Kaora Shibacaki
PDF
Ruby風Swift NSOperation編
by
Hisakuni Fujimoto
PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
by
hecomi
PDF
Reactive Extensions v2.0
by
Yoshifumi Kawai
PDF
PHPコードではなく PHPコードの「書き方」を知る
by
Masashi Shinbara
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
by
YujiSoftware
TypeScript 言語処理系ことはじめ
by
Yu Nobuoka
React.jsでクライアントサイドなWebアプリ入門
by
spring_raining
C# 7.2 with .NET Core 2.1
by
信之 岩永
asm.jsとWebAssemblyって実際なんなの?
by
Yosuke Onoue
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
by
schoowebcampus
はてなブックマーク in Scala
by
Lintaro Ina
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
by
なおき きしだ
なぜリアクティブは重要か #ScalaMatsuri
by
Yuta Okamoto
ScalaMatsuri 2016
by
Yoshitaka Fujii
覚醒!JavaScript
by
Haraguchi Go
TypeScript 1.0 オーバービュー
by
Akira Inoue
Async Enhancement
by
kamiyam .
これからのJavaScriptの話
by
Shogo Sensui
モテる JavaScript
by
Osamu Monoe
歌舞伎座Tech Rx会
by
Kaora Shibacaki
Ruby風Swift NSOperation編
by
Hisakuni Fujimoto
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
by
hecomi
Reactive Extensions v2.0
by
Yoshifumi Kawai
PHPコードではなく PHPコードの「書き方」を知る
by
Masashi Shinbara
Viewers also liked
PPTX
Getting started with ES6 : Future of javascript
by
Mohd Saeed
PDF
関数型プログラミング in javascript
by
Ryuma Tsukano
PDF
9 anti-patterns for node.js teams
by
Jeff Harrell
PDF
React Canvasで作るFlappy Bird
by
Takuya Tejima
PDF
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
by
Teppei Sato
PDF
CRDT in 15 minutes
by
Shingo Omura
PDF
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
by
アシアル株式会社
PDF
Isomorphic web development with scala and scala.js
by
TanUkkii
PDF
プログラミング言語Scala
by
TanUkkii
PPTX
ES6 - JavaCro 2016
by
Nenad Pecanac
PDF
JavaScript 実践講座 Framework, Tool, Performance
by
クラスメソッド株式会社
PDF
JavaScript.Next Returns
by
dynamis
PDF
jQuery勉強会#4
by
Ryo Maruyama
PPTX
Architecture of Falcon, a new chat messaging backend system build on Scala
by
TanUkkii
PDF
kontainer-js
by
Kuu Miyazaki
PDF
ES6 はじめました
by
Net Kanayan
PDF
Whim and Serverless DevOps with Mocha, Github and Travis
by
Sami Pippuri
PDF
Prototypeベース in JavaScript
by
Ryo Maruyama
PDF
FileReader and canvas and server silde
by
Net Kanayan
PPTX
JavaScript : What is it really? AND Some new features in ES6
by
Aayush Shrestha
Getting started with ES6 : Future of javascript
by
Mohd Saeed
関数型プログラミング in javascript
by
Ryuma Tsukano
9 anti-patterns for node.js teams
by
Jeff Harrell
React Canvasで作るFlappy Bird
by
Takuya Tejima
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
by
Teppei Sato
CRDT in 15 minutes
by
Shingo Omura
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
by
アシアル株式会社
Isomorphic web development with scala and scala.js
by
TanUkkii
プログラミング言語Scala
by
TanUkkii
ES6 - JavaCro 2016
by
Nenad Pecanac
JavaScript 実践講座 Framework, Tool, Performance
by
クラスメソッド株式会社
JavaScript.Next Returns
by
dynamis
jQuery勉強会#4
by
Ryo Maruyama
Architecture of Falcon, a new chat messaging backend system build on Scala
by
TanUkkii
kontainer-js
by
Kuu Miyazaki
ES6 はじめました
by
Net Kanayan
Whim and Serverless DevOps with Mocha, Github and Travis
by
Sami Pippuri
Prototypeベース in JavaScript
by
Ryo Maruyama
FileReader and canvas and server silde
by
Net Kanayan
JavaScript : What is it really? AND Some new features in ES6
by
Aayush Shrestha
Similar to ECMAScript6による関数型プログラミング
PPTX
Startup JavaScript
by
Akinari Tsugo
PDF
最強オブジェクト指向言語 JavaScript 再入門!
by
Yuji Nojima
PDF
ECMAScript没proposal追悼式
by
京大 マイコンクラブ
PDF
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 1 章
by
Narimichi Takamura
PDF
Swiftによる関数型プログラミング超入門
by
Hisakuni Fujimoto
PDF
すごい配列楽しく学ぼう
by
xenophobia__
PDF
JavaScript/CSS 2015 Autumn
by
Koji Ishimoto
PPTX
Nds meetup8 lt
by
ushiboy
ODP
Javascriptで学ぶ Functional Programming
by
todorokit
PPTX
JavaScriptクイックスタート
by
Shumpei Shiraishi
PDF
traceur-compilerで ECMAScript6を体験
by
Toshio Ehara
PPTX
前期講座08
by
Takenori Nakagawa
PDF
JavaScript (ECMAScript) 2013
by
dynamis
PDF
Javascripでオブジェクト指向
by
1000 VICKY
PDF
ECMAScript 6 Features(PDF 版)
by
taskie
PDF
Kanazawa.js.Next
by
dynamis
PDF
JavaScript.Next
by
dynamis
PDF
これからの「言語」の話をしよう ―― 未来を生きるためのツール
by
Nobuhisa Koizumi
PDF
JavaScript超入門 基礎
by
tetsu6
PDF
150420 flash004 変数
by
elephancube
Startup JavaScript
by
Akinari Tsugo
最強オブジェクト指向言語 JavaScript 再入門!
by
Yuji Nojima
ECMAScript没proposal追悼式
by
京大 マイコンクラブ
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 1 章
by
Narimichi Takamura
Swiftによる関数型プログラミング超入門
by
Hisakuni Fujimoto
すごい配列楽しく学ぼう
by
xenophobia__
JavaScript/CSS 2015 Autumn
by
Koji Ishimoto
Nds meetup8 lt
by
ushiboy
Javascriptで学ぶ Functional Programming
by
todorokit
JavaScriptクイックスタート
by
Shumpei Shiraishi
traceur-compilerで ECMAScript6を体験
by
Toshio Ehara
前期講座08
by
Takenori Nakagawa
JavaScript (ECMAScript) 2013
by
dynamis
Javascripでオブジェクト指向
by
1000 VICKY
ECMAScript 6 Features(PDF 版)
by
taskie
Kanazawa.js.Next
by
dynamis
JavaScript.Next
by
dynamis
これからの「言語」の話をしよう ―― 未来を生きるためのツール
by
Nobuhisa Koizumi
JavaScript超入門 基礎
by
tetsu6
150420 flash004 変数
by
elephancube
More from TanUkkii
PDF
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
by
TanUkkii
PDF
Distributed ID generator in ChatWork
by
TanUkkii
PPTX
Akka Clusterの耐障害設計
by
TanUkkii
PPTX
JSON CRDT
by
TanUkkii
PDF
Scalaによる型安全なエラーハンドリング
by
TanUkkii
PPTX
スケールするシステムにおけるエンティティの扱いと 分散ID生成
by
TanUkkii
PDF
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
by
TanUkkii
PDF
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
by
TanUkkii
PDF
ディープニューラルネット入門
by
TanUkkii
PDF
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
by
TanUkkii
PPTX
Akka HTTP
by
TanUkkii
PDF
WaveNet
by
TanUkkii
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
by
TanUkkii
Distributed ID generator in ChatWork
by
TanUkkii
Akka Clusterの耐障害設計
by
TanUkkii
JSON CRDT
by
TanUkkii
Scalaによる型安全なエラーハンドリング
by
TanUkkii
スケールするシステムにおけるエンティティの扱いと 分散ID生成
by
TanUkkii
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
by
TanUkkii
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
by
TanUkkii
ディープニューラルネット入門
by
TanUkkii
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
by
TanUkkii
Akka HTTP
by
TanUkkii
WaveNet
by
TanUkkii
ECMAScript6による関数型プログラミング
1.
ECMAScript6による 関数型プログラミング 株式会社トライフォート
安田裕介
2.
自己紹介 • 名前:安田裕介
• Trifortに今年入社の新卒1年生 • Webフロントエンジニアやってます • JavaScript, Scala, C++が好き • GitHubアカウント: TanUkkii007
3.
関数型プログラミングとは? 副作用を排除し関数オブジェクトを駆使する プログラミングパラダイム
関数型プログラミングの2大構成要素 • 第一級オブジェクトとしての関数 • イミュータビリティ(不変性) 拡張性と保守性の高いコードを書く手法として 近年注目を集めている
4.
JavaScriptと 関数型プログラミングの関係 JavaScriptは関数型プログラミング言語である
Schemeの第一級関数オブジェクトを受け継いだ言語 ECMAScript6は関数型の以下の機能をも 可能にする 1. 変更不可能な変数の宣言 2. パターンマッチ 3. 再帰による繰り返し処理 4. 不変なデータ構造
5.
1.変更不可能な変数の宣言 • 関数型プログラミングでは値の変更を行わない
• 変数への再代入を行わない
6.
const宣言子 再代入できない変数を宣言する 1
"use strict"; 2 const foo = "foo"; 3 4 foo = “bar”; 5 //TypeError: foo is read-only ※strictモードの場合、再代入しようとするとTypeErrorとなる ※strictモードでない場合、再代入は暗黙に失敗する ※letと同様ブロックスコープをもつ
7.
2.パターンマッチ • 関数型プログラミングではパターンマッチによる値
の取り出しを行う • パターンマッチにより代入などの副作用を減らすこ とができる
8.
分割代入(デストラクチャリング) 配列やオブジェクトからパターンによって値を抽出する 配列パターンによる抽出
1 var [a,b] = [1,2];! 2 console.log(a, b);! 3 // 1 2! 4 ! 5 [b, a] = [a,b];! 6 ! 7! 8 var {name: name, family: {sister: sister}} ! 分割代入による値の交換 オブジェクトパターンによる抽出 ! ! ! ! ! ! = {name: 'John Doe', family: {sister: 1}}! 9 console.log(name, sister);! 10 // "John Doe" 1 ※for in/ofループや関数の引数でも使えます
9.
3.再帰による繰り返し処理 • 繰り返し処理の方法として再帰とループの2つの方法がある
• 再帰の方が代入などの副作用がなく、短く書ける • 関数型プログラミングでは繰り返し処理に再帰を使う • 末尾呼び出し最適化により再帰でのスタックオーバーフローを回避 する
10.
末尾呼び出し最適化 関数呼び出しが末尾呼び出しかどうかを判定し、 末尾呼び出しの場合、最適化する
call(call(call(call()))) • 関数は呼び出し元に戻るた め、その位置を記憶する • でもそれが関数本体の末尾 なら、戻る必要はない そこで末尾呼び出し最適化がおきる
11.
例)階乗の計算 1 //
再帰による階乗計算! 2 function factorial1(n) {! 3 if (n === 0)! 4 return 1;! 5 return n * factorial1(n - 1);! 6 }! 7 ! 8 //ループによる階乗計算! 9 function factorial2(n) {! 10 var result = 1;! 11 for (var i = 1; i <= n; ++i) {! 12 result *= i;! 13 }! 14 return result;! 15 }! 16 ! 17 factorial1(100000);! 18 // too much recursion! 19 factorial2(100000);! 20 // Infinity @k_matsuzaki さんに指摘して もらいました。これでは最適化 されません。正しくは↓ ←これが末尾呼び出し function factorial1(n, acc) { if (n == 0) return acc; return factorial1(n - 1, n * acc); 末尾呼び出し最適化が実装されれば 解決される!! } ←再帰ではスタックオーバーフロー ←ループではInfinityではあるが成功 factorial1(100000, 1);
12.
4.不変なデータ構造 • 関数型プログラミングにおける配列やリストなどの
データ構造は不変であり、自身の値を変更しない
13.
プロキシ 既存のオブジェクトをラップし、その一部の内部 メソッドをECMAScriptコードで実装して挙動を
変えることを可能にするオブジェクト プロキシオブジェクトの作り方 ! ! ! new Proxy(target, { get: //proxy[name] set: //proxy[name] = val apply: //proxy() construct: //new Proxy() deleteProperty: //delete proxy[name] }) ラップするターゲットオブジェクト 内部メソッドに実装を与えるハンドラーオブジェクト がおきたときの処理を 定義できる ※ハンドラーの各メソッドをトラップという ※トラップは全部で14個ある ※定義されていないトラップ ではデフォルトの挙動が用いられる ※apply, constructトラップは関数がターゲットとなるときのみ有効
14.
例)プロキシによる イミュータブルな配列 関数型プログラミングでは値を変更しない
ES6のプロキシを使って不変な配列を作ってみよう 方針 JavaScriptの配列には自身を変更する破壊メソッドがある pop, push, reverse, shift, sort, splice, unshift 破壊メソッドにsliceを挟むことで非破壊メソッドに変える
15.
通常の配列と同様 Arrayコンストラクタで 配列を作れるようにする
1 var immutable = { 2 Array: function(...array) { 3 return immutable.createArray(array); 4 }, 5 createArray: function(array = []) { 6 return new Proxy(array, { 7 get: function(target, name, receiver) { 8 var mutator 9 = immutable.mutators.filter(x => x === name)[0]; 10 if (mutator) { 11 return (...args) => { 12 var copy = target.slice(); 13 copy[mutator].apply(copy, args); 14 return immutable.createArray(copy); 15 }; 16 } else { 17 return target[name]; 18 } 19 } 20 }); 破壊メソッドの判定用の配列 21 }, 22 mutators: ["pop","push","reverse","shift","sort","splice","unshift"] 23 };
16.
1 var immutable
= { 2 Array: function(...array) { プロキシを 3 return immutable.createArray(array); 4 }, 5 createArray: function(array = []) { 6 return new Proxy(array, { 7 get: function(target, name, receiver) { 8 var mutator 9 = immutable.mutators.filter(x => x === name)[0]; 10 if (mutator) { 11 return (...args) => { 12 var copy = target.slice(); 13 copy[mutator].apply(copy, args); 14 return immutable.createArray(copy); 15 }; 16 } else { 17 return target[name]; 18 } 19 } 20 }); 21 }, 22 mutators: ["pop","push","reverse","shift","sort","splice","unshift"] 23 }; 作成しているのはここ
17.
! ! 5
createArray: function(array = []) { 6 return new Proxy(array, { ターゲットに配列を使用 7 get: function(target, name, receiver) { 8 getトラップ var mutator 9 を定義 = immutable.mutators.filter(x => x === name)[0]; 10 if (mutator) { 11 return (...args) => { 12 破壊メソッドなら var copy = target.slice(); 13 sliceを挟む関数を返す copy[mutator].apply(copy, args); 14 return immutable.createArray(copy); 15 }; 16 } else { コピーした配列で 17 return target[name]; プロキシを再作成 18 } 19 } 20 }); 21 }
18.
プロキシで作った不変配列は 配列とどう違うのか? !
1 var array = new immutable.Array(1,2,3); 2 var nativeArray = new Array(1,2,3); 3 4 array[array.length - 1]; //3 5 nativeArray[nativeArray.length - 1]; //3 6 7 for (var v of array) console.log(v); //1 2 3 8 for (var v of nativeArray) console.log(v); //1 2 3 9 10 11 var result = array.push(4).reverse(); //[4,3,2,1] 12 array === result; //false 13 array; //[1,2,3] 14 15 nativeArray.push(4); 16 var nativeResult = nativeArray.reverse(); //[4,3,2,1] 17 nativeResult === nativeResult; //true 18 nativeArray; //[4,3,2,1] ←不変配列 ←組み込みの配列 使い方と挙動に 違いはない 不変配列では元の配列は 変わっていない 組み込みの配列では 元の配列は変わっている
19.
まとめ 関数型の機能をES6でどう実現するかを見てきた 1.
変更不可能な変数の宣言 2. パターンマッチ 3. 再帰による繰り返し処理 4. 不変なデータ構造 → const宣言子 → 分割代入 → 末尾呼び出し最適化 → プロキシ ECMAScript6の表現力で 関数型プログラミングを楽しもう!
Download