Те, що обговорюється, є по суті різницею між методологією обробки на основі поштовху та методом, що базується на витягуванні. У push-системі, подібній цій бібліотеці труб, ви встановлюєте ланцюжок обробки, і кожен етап обробки висуває свої дані безпосередньо в наступний. У витяжній системі, як діапазони, ви встановлюєте подання даних, до яких ви можете отримувати доступ та змінювати за потребою. Обробка не відбувається сама по собі; це відбувається лише тоді, коли хтось намагається споживати асортимент.
unzip
І fork
операції як один-до-багатьох операції: вони займають один вхід і відобразити його на багатьох технологічних операцій.
Як система штовхання, бібліотека труб може обробляти операції "один на багато" через структуру свого API. Операція представлена викликом функції; вхід має на увазі точку використання (використання >>=
або передача його процесору). Параметри функції визначають її вихід (ігноруючи параметри, призначені для самого процесора). А оскільки функції C ++ можуть мати довільну кількість параметрів, операція зі створенням картки один на багато, природно, випадає. Ви просто постачаєте відповідні процесори для різних виходів.
Як система потягу, діапазони базуються на значеннях повернення. C ++ не має мовного механізму повернення декількох значень, тому найкраще, що ми можемо зробити, це повернути "значення", яке представляє кілька значень.
Однак ланцюг адаптерів діапазону в кінцевому рахунку заснований на входах, що знаходяться в діапазоні . І "" значення ", яке представляє кілька значень", саме по собі не є діапазоном. Він може містити діапазони, але це не робить його діапазоном.
Тож тепер вам належить прийняти цей виразний тип "не діапазон" і змусити з ним працювати всі ваші адаптери діапазону. Застосовуючи адаптер діапазону, слід транслювати цю операцію по всьому типу, створюючи багато-багато-багато операцій. Зробити це непросто.
Але ще важливіше ... це, мабуть, не те, що ви хочете . Якщо ви fork
користуєтеся діапазоном, то ви майже напевно хочете виконати різну обробку на повторених діапазонах. І це повністю виключає будь-який шанс використання |
операції для цього. Вам доведеться побудувати способи застосування адаптерів до певних частин цих кортежів діапазону. І ці способи все частіше виглядають як поштовховий процесор.
Зрештою, система в стилі "тяга" має лише один вихід на кожному рівні. Це тільки частина основної концепції такого API: кожен крок обробки генерує в діапазон. У цього є свої переваги (ледача обробка), але представлення операцій, призначених одним багатьом, є однією з її слабких сфер.
Діапазони, безумовно, можуть мати unzip
функцію ( fork
це дійсно просто копіювання діапазону). Але це не був би |
адаптер стилю; це була б функція, яка займає діапазон над деяким розкладовим типом і повертає кордону діапазонів. Якщо ви хочете більше обробити їх, вам потрібно буде зберегти кортеж у значенні, отримати доступ до окремих елементів і використовувати їх, як вважаєте за потрібне.