遅延シーケンス操作への(やや)普遍的アプローチ
5702 ワード
仲間の開発者、何回
私のように、これらの方法がどれほど表現力があるのかを絶対的に愛する人のほとんどは、それぞれの言語で解決策を見つけました. C++のRange V3またはC++20 Ranges
JavaScriptのsequency
Java 8のStream API
kotinのsequences
のRustのiter
Haskellのリスト、シーケンスなど それはすべての素晴らしいですが、彼らはすべての完全に別のインターフェイスを、いくつかのハードを拡張するなど..
どうすれば、我々はちょうど1つの方法を行うことができますか?
プログラミング言語間の統一されたインタフェースで私の試みを紹介します.
これらの空想的な言葉は、あなたの言語がジェネレータ(あるいはより良い、Coroutines)をサポートしているならば次に、おそらくあなたの選択言語に擬似コードを適応することによってこれを実装することができます.
より幸運であり、ジェネレータやコルーチンにアクセスできない私たちのために、代わりにイテレータを使用するためにこのライブラリを適応させる方法があります.
以下に例を示します:
図書館を書くことは本当に簡単で簡単です.どんな貢献でも有り難いです.
array.map(mapper).filter(predicate)
intoarray.reduce(() => {
// Oh my god what do I do?
}, [])
ちょうどnループの追加コストを避けるために?私のように、これらの方法がどれほど表現力があるのかを絶対的に愛する人のほとんどは、それぞれの言語で解決策を見つけました.
どうすれば、我々はちょうど1つの方法を行うことができますか?
プログラミング言語間の統一されたインタフェースで私の試みを紹介します.
これらの空想的な言葉は、あなたの言語がジェネレータ(あるいはより良い、Coroutines)をサポートしているならば次に、おそらくあなたの選択言語に擬似コードを適応することによってこれを実装することができます.
より幸運であり、ジェネレータやコルーチンにアクセスできない私たちのために、代わりにイテレータを使用するためにこのライブラリを適応させる方法があります.
以下に例を示します:
const results = Stream.range(10)
.skip(5)
.take(100)
.map(x => 3*x - 5)
.filter(x => x % 4 === 0)
.map(x => x * 2)
.take(5)
.toArray();
console.log(results); // [32, 56, 80, 104, 128]
//// Strictly equivalent (in complexity) to
const results = [];
let count = 0;
for(const item of someMagicalIteratorRangeToSavePerformances(10, 115)){
if(count >= 5)
break;
const alpha = 3*item - 5;
if(alpha % 4 === 0){
const beta = alpha * 2;
results.push(beta);
count++;
}
}
console.log(results);
簡単に書くこと、読みやすい、我々が大好きなすべて.図書館を書くことは本当に簡単で簡単です.どんな貢献でも有り難いです.
Reference
この問題について(遅延シーケンス操作への(やや)普遍的アプローチ), 我々は、より多くの情報をここで見つけました https://dev.to/voltra/a-somewhat-universal-approach-to-lazy-sequence-manipulation-541hテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol