関数合成の書きにくさ

ここまでに随分と紙幅をとってしまったが、もともとここから先を書きたかった。

先に 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 で言うところの関手は、どこが同じでどこが違うのだろう?)

エディターで、関数はイタリック、値はノーマル、みたくフォントを使い分けられたら違うのだろうか?
関数だって「値」で、値に名前をつけているだけ。だから特別扱いするほうがおかしい、という見方もあるだろう。

とはいいながら、別の値に適用可能な値と、そもそも適用できな値とは、表現が変えられたほうが理解はたやすい、のではなかろうか。

結論だせず、グダグダで終わる。