93
Y f => (x => f(x(x)))(x => f(x(x))) Mozi ll a Japan テクニカルマーケティング 清水智公 (nshimizu @ mozi ll a-japan.org / @ chikoski) html 5j Web プラットフォーム部 第12回勉強会 Satis function( ){ ... };

20160428 html5jwebplat

Embed Size (px)

Citation preview

Y= f => (x => f(x(x)))(x => f(x(x)))

Mozilla Japan テクニカルマーケティング 清水智公 ([email protected] / @chikoski)

html5j Webプラットフォーム部 第12回勉強会 Satis function( ){ ... };

Firefox for iOSFirefoxをiPhone、iPad、 そしてiPod touchでも

N. Shimizu

• Mozilla Japan: L10N / dev-rel in devtools and games

• html5j Web プラットフォーム部、Firefox OS、Firefox OS コードリーディング、 html5j ゲーム部

• @chikoski

• プログラミング言語、圏論、分類、ベイジアン、サッカー

データと操作

数学的な関数:変数に依存して決まる値、もしくはその対応関係のこと

得点 得点率100点 満点

合格点以上?

採点

関数型言語の代表的特徴 JavaScript

第一級関数 ◯

参照透過性 ×(破壊的な操作が可能)

単一代入 △(constを利用すれば実現可能)

型による制約 ×(duck typing)

遅延評価 ×(常に正格な評価を行う)

直和型 ×

関数定義

function 文:名前付きの関数を定義する文

function 式:無名関数を定義する式

よく見る無名関数の利用例

よく見る無名関数の利用例

式: 評価すると値になるもの

式の例

代入をすることによって値に名前をつける

無名関数の定義も式

関数を変数に代入できる

関数の変数への代入、代入された関数の参照

関数の呼び出し

関数の呼び出し

関数を引数にとる関数

配列の値の合計を求める関数

配列の値の2乗和を求める関数

配列の値の3乗和を求める関数

配列の各要素に関数 f を適用した結果の総和を求める関数

関数を切り替えることで振る舞いを変更する

よく見る関数を引数とする関数の呼び出し

リスト処理

filter:フィルタする判断をパラメータ化

sort:順序の判定方法をパラメータ化

map / reduce:写像方法と左畳み込みの方法をパラメータ化

every / some:条件の判定をパラメータ化

forEach:繰り返す手続きをパラメータ化

関数を返す関数

関数を返り値とする関数を定義できる

引数の片方を固定することで、特殊な関数を定義できる

関数を返す関数の利用例: 関数の一部分を固定し、特殊な関数を作成する

関数を返す関数を利用して、「同じようなことをする」関数を生成できる

関数を引数とし、関数を返す関数

関数を切り替えることで振る舞いを変更する

リストの総和を求める関数を返す関数 sigma

合計、二乗和、三乗和を求める関数の定義と利用

参照透過性

純粋な関数:同じ入力であれば、常に同じ値が出力される

参照透過性のある関数

参照透過性のない関数:呼び出すたびに返り値の値が異なる

破壊的な操作 / 副作用:状態を変更する操作

クロージャを利用して、状態のスナップショットを取る

参照透過なカウンターの利用例

オブジェクト指向で実装したカウンタの利用例

カリー化

足し算を行う関数

関数を返すように書き換える

関数を返す関数

書き換えた add の使用例

カリー化:複数の引数をとる関数を1つの引数をとる関数にかえること

カリー化を利用した条件分岐の実現

自然数の関数表現

Yコンビネータ

再代入:同じ変数に対する代入

x に基づく仕事をしていいのか?

const:ローカルな定数の作成

const:ローカルな定数の作成

コールスタック Call stack consumption in recursive calls

n * factorial(n - 1); のバイトコード

コールスタックサイズの調査

Runtime Call stack size

Firefox 50994

Google Chrome 10402

node.js 11034

コンソールで実行すると call stack があふれる

コンソールで実行すると call stack があふれる

strict モードの末尾再帰はインライン展開される(ES2015)

インライン展開のイメージ

パフォーマンス

普通のエラーハンドリング

Promiseによるエラーハンドリング

イベント:時系列データ

イベント A B C D