関数合成の書きにくさ
ここまでに随分と紙幅をとってしまったが、もともとここから先を書きたかった。
先に unique を示したが、重複を取り除く処理とともに、取り除かれる要素を取り出す処理を並べて書きたくなった。
ナイーブに書けば、こうなるだろう。
function hoge(array) { const unis = array.filter((val, idx, arr) => arr.indexOf(val) === idx); const dups = array.filter((val, idx, arr) => arr.indexOf(val) !== idx); // continues calculation on unis and dups...
お気づきのとおり違いは `===` と `!==`、比較の結果のみである。
こういう場合に、以下のようにサクッと関数合成が使えたら楽なのになあ、という話。:
function hoge(array) { const unique = (value, index, array) => array.indexOf(value) === index; const unis = array.filter(unique); const dups = array.filter(not <of> unique); // continues calculation on unis and dups...
Haskell 使っておけよタコ助、という話でもある。
無理やり JavaScript 文法に落とすと、次のようになる。:
function hoge(array) { const unique = (value, index, array) => array.indexOf(value) === index; const not = f => function() { return !f.apply(null, arguments); }; const unis = array.filter(unique); const dups = array.filter(not(unique)); // continues calculation on unis and dups...
C++ でテンプレート使った functor と同じなんだけれど、丸括弧が並ぶのは読みづらい。(この Functor と Haskell で言うところの関手は、どこが同じでどこが違うのだろう?)
エディターで、関数はイタリック、値はノーマル、みたくフォントを使い分けられたら違うのだろうか?
関数だって「値」で、値に名前をつけているだけ。だから特別扱いするほうがおかしい、という見方もあるだろう。
とはいいながら、別の値に適用可能な値と、そもそも適用できな値とは、表現が変えられたほうが理解はたやすい、のではなかろうか。
結論だせず、グダグダで終わる。