Submit Search
Upload
ECMAScript6による関数型プログラミング
•
11 likes
•
11,926 views
T
TanUkkii
Follow
2014/10/29のES6+カジュアルトークで発表した資料です。
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 19
Download now
Download to read offline
Recommended
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6
TanUkkii
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
Masahiro Wakame
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Tomohiro Kumagai
コンパイラ指向ReVIEW
コンパイラ指向ReVIEW
Masahiro Wakame
javascript を Xcode でテスト
javascript を Xcode でテスト
Yoichiro Sakurai
JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介
Yusuke Hirao
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
Masahiro Wakame
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
ShinichiAoyagi
Recommended
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6
TanUkkii
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
Masahiro Wakame
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Tomohiro Kumagai
コンパイラ指向ReVIEW
コンパイラ指向ReVIEW
Masahiro Wakame
javascript を Xcode でテスト
javascript を Xcode でテスト
Yoichiro Sakurai
JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介
Yusuke Hirao
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
Masahiro Wakame
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
ShinichiAoyagi
モテる JavaScript
モテる JavaScript
Osamu Monoe
Ruby風Swift NSOperation編
Ruby風Swift NSOperation編
Hisakuni Fujimoto
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知る
Masashi Shinbara
覚醒!JavaScript
覚醒!JavaScript
Haraguchi Go
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
Akira Inoue
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
なおき きしだ
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
Yu Nobuoka
歌舞伎座Tech Rx会
歌舞伎座Tech Rx会
Kaora Shibacaki
Async Enhancement
Async Enhancement
kamiyam .
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
信之 岩永
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
schoowebcampus
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
YujiSoftware
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
spring_raining
これからのJavaScriptの話
これからのJavaScriptの話
Shogo Sensui
asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?
Yosuke Onoue
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
Yuta Okamoto
Reactive Extensions v2.0
Reactive Extensions v2.0
Yoshifumi Kawai
ScalaMatsuri 2016
ScalaMatsuri 2016
Yoshitaka Fujii
はてなブックマーク in Scala
はてなブックマーク in Scala
Lintaro Ina
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Teppei Sato
Isomorphic web development with scala and scala.js
Isomorphic web development with scala and scala.js
TanUkkii
More Related Content
What's hot
モテる JavaScript
モテる JavaScript
Osamu Monoe
Ruby風Swift NSOperation編
Ruby風Swift NSOperation編
Hisakuni Fujimoto
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知る
Masashi Shinbara
覚醒!JavaScript
覚醒!JavaScript
Haraguchi Go
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
Akira Inoue
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
なおき きしだ
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
Yu Nobuoka
歌舞伎座Tech Rx会
歌舞伎座Tech Rx会
Kaora Shibacaki
Async Enhancement
Async Enhancement
kamiyam .
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
信之 岩永
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
schoowebcampus
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
YujiSoftware
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
spring_raining
これからのJavaScriptの話
これからのJavaScriptの話
Shogo Sensui
asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?
Yosuke Onoue
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
Yuta Okamoto
Reactive Extensions v2.0
Reactive Extensions v2.0
Yoshifumi Kawai
ScalaMatsuri 2016
ScalaMatsuri 2016
Yoshitaka Fujii
はてなブックマーク in Scala
はてなブックマーク in Scala
Lintaro Ina
What's hot
(20)
モテる JavaScript
モテる JavaScript
Ruby風Swift NSOperation編
Ruby風Swift NSOperation編
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知る
覚醒!JavaScript
覚醒!JavaScript
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
歌舞伎座Tech Rx会
歌舞伎座Tech Rx会
Async Enhancement
Async Enhancement
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
これからのJavaScriptの話
これからのJavaScriptの話
asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
Reactive Extensions v2.0
Reactive Extensions v2.0
ScalaMatsuri 2016
ScalaMatsuri 2016
はてなブックマーク in Scala
はてなブックマーク in Scala
Viewers also liked
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Teppei Sato
Isomorphic web development with scala and scala.js
Isomorphic web development with scala and scala.js
TanUkkii
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
アシアル株式会社
React Canvasで作るFlappy Bird
React Canvasで作るFlappy Bird
Takuya Tejima
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon, a new chat messaging backend system build on Scala
TanUkkii
Whim and Serverless DevOps with Mocha, Github and Travis
Whim and Serverless DevOps with Mocha, Github and Travis
Sami Pippuri
プログラミング言語Scala
プログラミング言語Scala
TanUkkii
9 anti-patterns for node.js teams
9 anti-patterns for node.js teams
Jeff Harrell
関数型プログラミング in javascript
関数型プログラミング in javascript
Ryuma Tsukano
CRDT in 15 minutes
CRDT in 15 minutes
Shingo Omura
kontainer-js
kontainer-js
Kuu Miyazaki
jQuery勉強会#4
jQuery勉強会#4
Ryo Maruyama
JavaScript : What is it really? AND Some new features in ES6
JavaScript : What is it really? AND Some new features in ES6
Aayush Shrestha
ES6 - JavaCro 2016
ES6 - JavaCro 2016
Nenad Pecanac
FileReader and canvas and server silde
FileReader and canvas and server silde
Net Kanayan
JavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, Performance
クラスメソッド株式会社
ES6 はじめました
ES6 はじめました
Net Kanayan
Getting started with ES6 : Future of javascript
Getting started with ES6 : Future of javascript
Mohd Saeed
JavaScript.Next Returns
JavaScript.Next Returns
dynamis
Prototypeベース in JavaScript
Prototypeベース in JavaScript
Ryo Maruyama
Viewers also liked
(20)
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Isomorphic web development with scala and scala.js
Isomorphic web development with scala and scala.js
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
React Canvasで作るFlappy Bird
React Canvasで作るFlappy Bird
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon, a new chat messaging backend system build on Scala
Whim and Serverless DevOps with Mocha, Github and Travis
Whim and Serverless DevOps with Mocha, Github and Travis
プログラミング言語Scala
プログラミング言語Scala
9 anti-patterns for node.js teams
9 anti-patterns for node.js teams
関数型プログラミング in javascript
関数型プログラミング in javascript
CRDT in 15 minutes
CRDT in 15 minutes
kontainer-js
kontainer-js
jQuery勉強会#4
jQuery勉強会#4
JavaScript : What is it really? AND Some new features in ES6
JavaScript : What is it really? AND Some new features in ES6
ES6 - JavaCro 2016
ES6 - JavaCro 2016
FileReader and canvas and server silde
FileReader and canvas and server silde
JavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, Performance
ES6 はじめました
ES6 はじめました
Getting started with ES6 : Future of javascript
Getting started with ES6 : Future of javascript
JavaScript.Next Returns
JavaScript.Next Returns
Prototypeベース in JavaScript
Prototypeベース in JavaScript
Similar to ECMAScript6による関数型プログラミング
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
Shogo Sensui
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
啓 小笠原
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Preferred Networks
TypeScript0.9
TypeScript0.9
ukayare
MoteMote Compiler Plugin
MoteMote Compiler Plugin
yoshiaki iwanaga
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
Mitsuru Katoh
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
Koji Ishimoto
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
JSクラス定義
JSクラス定義
Wataru Nakaseko
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
Takakiyo Tanaka
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Yatabe Terumasa
ATN No.2 Scala事始め
ATN No.2 Scala事始め
AdvancedTechNight
StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践
Shu Sugimoto
Hadoop jobbuilder
Hadoop jobbuilder
Taku Miyakawa
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Tasuku Otani
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Toshiyuki Ienaga
Clojure programming-chapter-2
Clojure programming-chapter-2
Masao Kato
秀スクリプトの話
秀スクリプトの話
Hiroshi Tokumaru
Ajax 応用
Ajax 応用
Katsuyuki Seino
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
Tomoharu ASAMI
Similar to ECMAScript6による関数型プログラミング
(20)
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
TypeScript0.9
TypeScript0.9
MoteMote Compiler Plugin
MoteMote Compiler Plugin
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
JSクラス定義
JSクラス定義
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
ATN No.2 Scala事始め
ATN No.2 Scala事始め
StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践
Hadoop jobbuilder
Hadoop jobbuilder
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Clojure programming-chapter-2
Clojure programming-chapter-2
秀スクリプトの話
秀スクリプトの話
Ajax 応用
Ajax 応用
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
More from TanUkkii
Distributed ID generator in ChatWork
Distributed ID generator in ChatWork
TanUkkii
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
TanUkkii
JSON CRDT
JSON CRDT
TanUkkii
Akka Clusterの耐障害設計
Akka Clusterの耐障害設計
TanUkkii
WaveNet
WaveNet
TanUkkii
スケールするシステムにおけるエンティティの扱いと 分散ID生成
スケールするシステムにおけるエンティティの扱いと 分散ID生成
TanUkkii
Akka HTTP
Akka HTTP
TanUkkii
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
TanUkkii
ディープニューラルネット入門
ディープニューラルネット入門
TanUkkii
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
TanUkkii
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
TanUkkii
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリング
TanUkkii
More from TanUkkii
(12)
Distributed ID generator in ChatWork
Distributed ID generator in ChatWork
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
JSON CRDT
JSON CRDT
Akka Clusterの耐障害設計
Akka Clusterの耐障害設計
WaveNet
WaveNet
スケールするシステムにおけるエンティティの扱いと 分散ID生成
スケールするシステムにおけるエンティティの扱いと 分散ID生成
Akka HTTP
Akka HTTP
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
ディープニューラルネット入門
ディープニューラルネット入門
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリング
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 now