非空のデータ構造を必要とする折り目を扱う
5005 ワード
いくつかの折り畳み(AKA減少)はアキュムレータまたは初期値を含んでいないので、非空の折り畳み可能なデータ構造を必要とする.そのような折り目は2つの問題とともに来ます.
最初の問題はタイプに関するものです.アキュムレータは、折り畳み可能な要素の型とは異なるタイプを持つことができるので、縮小法を用いることができます.例えば、
2番目の問題は、空のデータ構造を渡す場合についてです.アキュムレータなしでは何も戻ることはありません.関数を部分的に表示するエラーが発生します.
ここでは、両方の問題をクリーンな機能的方法で解決する非空の折り畳み型のフォールドです.
アキュムレータ
このmimplementationはscriptum FP libの一部です
最初の問題はタイプに関するものです.アキュムレータは、折り畳み可能な要素の型とは異なるタイプを持つことができるので、縮小法を用いることができます.例えば、
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)を期待する.空の構造が提供されるならば、それはそうでなければarrFold1
とNone
(B)を返します.このmimplementationはscriptum FP libの一部です
Reference
この問題について(非空のデータ構造を必要とする折り目を扱う), 我々は、より多くの情報をここで見つけました https://dev.to/iquardt/fold-non-empty-foldables-50a1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol