引き続きGWひとりもくもく開催中。
家事もせず、睡眠時間も削り、、ひたすらゴリゴリコード書いてみたりしてて、集中力が落ちてきました。。(ちょっと他のこともやりましたが)
https://oukayuka.booth.pm/items/1312652
引き続きこちらをやっています!(GOどころかReactまでできるのか〜??)
関数型プログラミング
関数型プログラミングは、ぼんやりと想像していたのですが、思っていたのとなんか違いましたです・・。
関数型プログラミングで実現されていること
- 無名関数が使える
- 変数に関数を代入することができる
- 関数の引数に関数が渡せる
- 戻り値に関数を返すことができる(高階関数)
- 関数に特定の引数を固定した新しい関数を作ることができる(部分適用)
- 複数の高階関数を合成して1つの関数にできる
// 無名関数を n => n * 2 // 変数に代入できる const double = n => n * 2
Higher Order Fuction - 高階関数
- 引数に関数をとることができる
- 戻り値に関数を返すことができる
// 引数に関数を渡す ary.map(n => n * 2) // 戻り値に関数を返す const hof=(ex,fn) => { return n=> fn(n + ex); }; const test = hof(1, n=>n * 2); console.log(test(4));
$ node higherorderfunction.js 10
むむぅ〜。よくわからぬ〜
(4+1) x 2 = 10 らしぃ・・むずぃイィ。。
Higher Order Component (HOC)を理解するのに必要らしぃ・・
恵比寿のRreactもくもく行って聞いてみようかぁ・・
Closure。クロージャー関数
これも以前に何度もQiitaみたり、ググったりしたけど、いまいちわからんのです。
- JavaのClojureではない
- 関数閉包
まず、普通に書いてみる
class Counter { constructor(initialCount) { this.c = initialCount; } increment() { return this.c++; } } const counter = new Counter(1); console.log(counter.increment(), counter.increment(), counter.increment());
$ node closure.js 1 2 3
クロージャーを使う
const counterMaker = (initialCount) => { let c = initialCount; // Why? クリアされない const increment = () => c++; return increment; // 関数「increment = () => c++」を返している }; const count = counterMaker(1); console.log(count(), count(), count());
$ node closure.js 1 2 3
count()の戻りが、内部関数のincrement(increment = () => c++;)countMarker内部で実行されるから、cの値がリセットされずに蓄積されていく
そーゆーもん!
Reactのテイでいうと
関数コンポーネントを実装するとき、外部スコープの変数を参照する関数を定義することがある、それがクロージャーにあたる・・・らしい。
むむぅ・・
ジェネレータ関数
- 値を保持しつつ繰り返し処理や逐次処理を行うための関数
function* rangeGenerator(end, start = 0) { let n = 0; for (let i=start; i<end; i++) { n+=1; yield i; } } const gen = rangeGenerator(3); console.log(gen.next()); console.log(gen.next()); console.log(gen.next()); console.log(gen.next()); console.log(gen.next());
$ node generator.js { value: 0, done: false } { value: 1, done: false } { value: 2, done: false } { value: undefined, done: true } { value: undefined, done: true }
ってのがある。詳しくは本参考。何となく覚えておく。
必要になったら見返そう・・・
カリー化
だんだん・・ついて行けなくなってきたぁ〜(泣
- 複数の引数をとる関数を、ひとつだけ引数をとる関数に分割してネストさせること
何のためにそんなことするねん。。
理解は追い追いとして、とりあえず動作確認しておく。
const multi = (n,m) => n * m; console.log(multi(2,4)); const curriedMulti = n => { console.log(n); return m => n * m; } console.log(curriedMulti(2)(4)); const simpleCurriedMulti = n => m => n * m; console.log(simpleCurriedMulti(2)(4));
$ node curring.js 8 2 8 8
カリー化部分適用
用途が想像つかないんだけど、動かしておく
const multi = n => m => n * m; console.log(multi(3)(5)); const triple = multi(3); console.log(triple(5));
$ node curring2.js 15 15
何となーく、何なーなぁぁあーく・・こんなのがあるのね〜な感じで、頭の隅に置いておく・・。