プリキュアの録画始まったと思って起きてきたらプリオケの特番だった
ベターKotlinとしてのScalaいいだろと個人的には思ってるけど国内のScala求人は軒並みハードルが高いからScalaに振るのがあまりオススメできない
Result(Either)は定義が単純だから気軽に導入できるが、Eitherあるんだからモナドトランスフォーマーもいりますよねって言うと拒否反応を示されるので注意しよう!
flatMapできる構造っていうのは、雑に言えば入れ子で二重になってるArrayやPromiseとかを一重のArrayやPromiseに変換できるっていうのと同じことです
JSのPromiseはthenの中でPromise返すと二重Promiseにならずに一重Promiseに潰れるのでこれが実質flatMapです
クッソ細かいことを言うとPromiseは厳密にはモナドが満たすべき法則をびみょ~~~~に満たしてないのでモナドではないんですがほぼモナドだと雑に考えても問題はないです
このアカウントは、notestockで公開設定になっていません。
モナド則
1. return a >>= k = k a
2. m >>= return = m
3. m >>= (\x -> k x >>= h) = (m >>= k) >>= h
thenの特殊な挙動によってモナド則が壊れるのはまあいいとして、例外の送出を踏まえると更に壊れるような気がしているんだが、いまいち情報がないな。
Promise.resolve(1).then(r => Promise.resolve((() => { throw new Error() })())) みたいなケースで壊れるような気がする
あーわかった。Promise.resolve(1).then(r => { throw new Error() }) は (r => { throw new Error() })(1) と等しくないといけないはずだけど実際にはPromise.rejectを返しちゃうからleft identity則が壊れるんだ。
thenがfmapとbindの両方の動作をしているから一部のケースでFunctorを構成できなかったりモナド則を満たさなかったりするように見えるけど、これそもそもPromise<Promise<hoge>>という型を持つ値を構成する手段がない状態ではモナド則は壊せないのでは?
そもそも
return (return a) >>= f = f (return a)
が成り立たないからモナド則は敗れている。了解です。