引き続き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
何となーく、何なーなぁぁあーく・・こんなのがあるのね〜な感じで、頭の隅に置いておく・・。
