📔

99%のプログラマが知らないPromiseのこと

2023/12/05に公開

この記事は、

関数型プログラミングの入門本

Functional Programming From Scratch

関数型プログラミングをゼロからわかりやすく実用的に幅広い視点から解説!〜 圏論からFRPの構築まで

🔷UNIT 1🔷 OVERVIEW

image

https://zenn.dev/ken_okabe/books/functional-programming-from-scratch-1/

からの抜粋です。


💡 99%のプログラマが知らないPromiseのこと"


命令型プログラミングの最後の呪縛〜時間を関数型プログラミングではどう取り扱うのか?

image


JavaScriptのPromise

JavaScriptの Promise について、いまひとつ腑に落ちない、なんかモヤモヤしたものを感じている、ということはないだろうか?

image

image

未来のある時点で値を提供するプロミス というのは、これまで紹介してきた イベントドリブン の仕組みであり、ブロックユニバース上の タイムライン に他ならない、つまりFRPだ

image


Promiseというデータ構造、JavaScriptでいうところのオブジェクトを定義してみよう

image

この promise という名前のデータ構造は、 timelineA と名前を替えてももちろん構わない

const timelineA = new Promise(resolve => {
    setTimeout(() => {
        resolve('Event triggered after 1 second');
    }, 1000);
});

timelineA.then(message => console.log(message));

PromiseはBlockユニバース上のタイムラインの二項演算でFRP

timelineA はFRPの値なので、表計算アプリのセルのようなものとイメージしても良い

image

この図ではA1というセルが 5 になり、その値がFRPの二項演算で伝播して 6 になっている

JavaScriptの resolve で言い直すと、セルA1が 5resolve された

timelineA で言い直すと、時間軸(タイムライン)上で、現在から相対座標として 1秒後'Event triggered after 1 second' という値をプロットした


では、

timelineA.then(message => console.log(message));

が何か?というと、 タイムラインの二項演算

image

もうちょっと正確に描き直せば、JavaScriptの Promise はたった一度だけしかイベントを発生しないので、特にこのケースでは

image

todo 関数は具体的に message => console.log(message) という関数になっている

ただ一度のイベントしか発生しない Promise オブジェクトの演算子は .then というメソッド

このようなタイムラインの二項演算の結果、 timelineB という別のタイムラインが得られる

繰り返しとなるが、これは  1 + 2 という式の二項演算をすれば 3 という別の値(式)という結果が得られる、という足し算とは異なるパターンだが、代数構造でしかない

PromiseはBlockユニバース上のタイムラインの二項演算 なのだが、巷の説明は当然そういうことはすべてすっ飛ばすので、同じMDNのドキュメントでは

image

ここからがマジックです

then() 関数は元とは異なる 新しいプロミス を返します

と薮から棒に 謎に満ちた新しい仕様を与えられる という結構いい加減な説明を読まされた挙げ句、わかったようなわからないような・・・

というのが99%以上のJavaScriptプログラマの頭の中で起こっていることだろう

Discussion