非空のデータ構造を必要とする折り目を扱う


いくつかの折り畳み(AKA減少)はアキュムレータまたは初期値を含んでいないので、非空の折り畳み可能なデータ構造を必要とする.そのような折り目は2つの問題とともに来ます.
最初の問題はタイプに関するものです.アキュムレータは、折り畳み可能な要素の型とは異なるタイプを持つことができるので、縮小法を用いることができます.例えば、maxnから[Number,Number,Number]まで減らすことができます.アキュムレータなしでは、我々はsymetric型だけを表すことができます.
2番目の問題は、空のデータ構造を渡す場合についてです.アキュムレータなしでは何も戻ることはありません.関数を部分的に表示するエラーが発生します.
ここでは、両方の問題をクリーンな機能的方法で解決する非空の折り畳み型のフォールドです.
const arrFold1 = f => g => xs => {
//                    ^ A
  let acc;

  if (xs.length === 0)
    return None;
//         ^^^^ B

  acc = g(xs[0]);

  for (let i = 1; i < xs.length; i++)
    acc = f(acc) (xs[i], i);

  return Some(acc);
//       ^^^^^^^^^ B
};

const maxn = ({fold1, max}) => tx =>
  fold1(x => y =>
    max(x) (y)) (x => x) (tx);

const numMax = m => n =>
  n > m ? n : m;

maxn({fold1: arrFold1, max: numMax})
  ([1,2,30,4,5,6]); // Some(30)

maxn({fold1: arrFold1, max: numMax})
  ([]); // None
run code
アキュムレータStringの代わりに、第1の要素の型を変換してもよいし、または変換してもならない単項関数(a)を期待する.空の構造が提供されるならば、それはそうでなければarrFold1None(B)を返します.
このmimplementationはscriptum FP libの一部です