Чому діапазони не можна використовувати для функціонування бібліотеки труб?


10

Джонатан Боккара (автор Fluent C ++ ) написав бібліотеку під назвою Труби .

Цей "трубопровід", на головній сторінці сховища, каже, не схожий на використання діапазонів, хоча це виглядає так само: Це не на основі ледачого витягування, а швидше на прагнення натискання. Але заявлено, що не можна використовувати бібліотеку діапазонів для виконання різних операцій "труба". Наприклад:

  • unzip - Візьміть блискавковий вхід - по суті діапазон k-кортежів - і створіть k окремих, незалежних результатів.
  • fork - Створення декількох (незалежних) копій контейнера / діапазону.

Я не зовсім розумію, чому в принципі це так. (Звичайно, за винятком діапазонів, де ви не можете отримати кінцевий ітератор / дозор.)

Відповіді:


7

Те, що обговорюється, є по суті різницею між методологією обробки на основі поштовху та методом, що базується на витягуванні. У push-системі, подібній цій бібліотеці труб, ви встановлюєте ланцюжок обробки, і кожен етап обробки висуває свої дані безпосередньо в наступний. У витяжній системі, як діапазони, ви встановлюєте подання даних, до яких ви можете отримувати доступ та змінювати за потребою. Обробка не відбувається сама по собі; це відбувається лише тоді, коли хтось намагається споживати асортимент.

unzipІ forkоперації як один-до-багатьох операції: вони займають один вхід і відобразити його на багатьох технологічних операцій.

Як система штовхання, бібліотека труб може обробляти операції "один на багато" через структуру свого API. Операція представлена ​​викликом функції; вхід має на увазі точку використання (використання >>=або передача його процесору). Параметри функції визначають її вихід (ігноруючи параметри, призначені для самого процесора). А оскільки функції C ++ можуть мати довільну кількість параметрів, операція зі створенням картки один на багато, природно, випадає. Ви просто постачаєте відповідні процесори для різних виходів.

Як система потягу, діапазони базуються на значеннях повернення. C ++ не має мовного механізму повернення декількох значень, тому найкраще, що ми можемо зробити, це повернути "значення", яке представляє кілька значень.

Однак ланцюг адаптерів діапазону в кінцевому рахунку заснований на входах, що знаходяться в діапазоні . І "" значення ", яке представляє кілька значень", саме по собі не є діапазоном. Він може містити діапазони, але це не робить його діапазоном.

Тож тепер вам належить прийняти цей виразний тип "не діапазон" і змусити з ним працювати всі ваші адаптери діапазону. Застосовуючи адаптер діапазону, слід транслювати цю операцію по всьому типу, створюючи багато-багато-багато операцій. Зробити це непросто.

Але ще важливіше ... це, мабуть, не те, що ви хочете . Якщо ви forkкористуєтеся діапазоном, то ви майже напевно хочете виконати різну обробку на повторених діапазонах. І це повністю виключає будь-який шанс використання |операції для цього. Вам доведеться побудувати способи застосування адаптерів до певних частин цих кортежів діапазону. І ці способи все частіше виглядають як поштовховий процесор.

Зрештою, система в стилі "тяга" має лише один вихід на кожному рівні. Це тільки частина основної концепції такого API: кожен крок обробки генерує в діапазон. У цього є свої переваги (ледача обробка), але представлення операцій, призначених одним багатьом, є однією з її слабких сфер.

Діапазони, безумовно, можуть мати unzipфункцію ( forkце дійсно просто копіювання діапазону). Але це не був би |адаптер стилю; це була б функція, яка займає діапазон над деяким розкладовим типом і повертає кордону діапазонів. Якщо ви хочете більше обробити їх, вам потрібно буде зберегти кортеж у значенні, отримати доступ до окремих елементів і використовувати їх, як вважаєте за потрібне.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.