遅延シーケンス操作への(やや)普遍的アプローチ


仲間の開発者、何回
array.map(mapper).filter(predicate)
into
array.reduce(() => {
    // Oh my god what do I do?
}, [])
ちょうどnループの追加コストを避けるために?
私のように、これらの方法がどれほど表現力があるのかを絶対的に愛する人のほとんどは、それぞれの言語で解決策を見つけました.
  • C++のRange V3またはC++20 Ranges
  • JavaScriptのsequency
  • Java 8のStream API
  • kotinのsequences
  • のRustのiter
  • Haskellのリスト、シーケンスなど
  • それはすべての素晴らしいですが、彼らはすべての完全に別のインターフェイスを、いくつかのハードを拡張するなど..
    どうすれば、我々はちょうど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);
    
    簡単に書くこと、読みやすい、我々が大好きなすべて.
    図書館を書くことは本当に簡単で簡単です.どんな貢献でも有り難いです.