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 式:無名関数を定義する式
代入をすることによって値に名前をつける
関数の変数への代入、代入された関数の参照
配列の各要素に関数 f を適用した結果の総和を求める関数
関数を切り替えることで振る舞いを変更する
よく見る関数を引数とする関数の呼び出し
filter:フィルタする判断をパラメータ化
sort:順序の判定方法をパラメータ化
map / reduce:写像方法と左畳み込みの方法をパラメータ化
every / some:条件の判定をパラメータ化
forEach:繰り返す手続きをパラメータ化
関数を返り値とする関数を定義できる
引数の片方を固定することで、特殊な関数を定義できる
関数を返す関数の利用例: 関数の一部分を固定し、特殊な関数を作成する
関数を返す関数を利用して、「同じようなことをする」関数を生成できる
関数を切り替えることで振る舞いを変更する
リストの総和を求める関数を返す関数 sigma
合計、二乗和、三乗和を求める関数の定義と利用
純粋な関数:同じ入力であれば、常に同じ値が出力される
参照透過性のない関数:呼び出すたびに返り値の値が異なる
破壊的な操作 / 副作用:状態を変更する操作
クロージャを利用して、状態のスナップショットを取る
オブジェクト指向で実装したカウンタの利用例
カリー化:複数の引数をとる関数を1つの引数をとる関数にかえること
コールスタック 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によるエラーハンドリング