Мені дуже цікаво дізнатись, де є відмінності, і в цілому, визначити канонічні випадки використання, коли HList не може бути використаний (а точніше, не приносить жодних переваг за звичайні списки).
(Я знаю, що TupleN
у Scala є 22 (я вважаю) , тоді як одному потрібен лише один HList, але це не та концептуальна різниця, яка мене цікавить.)
У тексті нижче я позначив пару питань. На це, можливо, не потрібно відповідати, вони мають на меті вказати на незрозумілі для мене речі та вести дискусію в певних напрямках.
Мотивація
Нещодавно я бачив пару відповідей на SO, де люди пропонували використовувати HLists (наприклад, як це надає Shapeless ), включаючи видалену відповідь на це питання . Це породило цю дискусію , що, в свою чергу, викликало це питання.
Вступ
Мені здається, що списки корисні лише тоді, коли ти статично знаєш кількість елементів та їх точні типи. Число насправді не є вирішальним, але здається малоймовірним, що вам коли-небудь знадобиться створити список з елементами різних, але статично точно відомих типів, але що ви статистично не знаєте їх кількості. Питання 1: Чи можете ви навіть написати такий приклад, наприклад, у циклі? Моя інтуїція полягає в тому, що наявність статично точного списку зі статично невідомою кількістю довільних елементів (довільної відносно даної ієрархії класів) просто не сумісна.
HLists vs. Tuples
Якщо це правда, тобто ви статистично знаєте число і тип - Запитання 2: чому б просто не використовувати n-кортеж? Звичайно, ви можете безпечно набрати карту та скласти HList (що також можна, але не набрати безпечно, зробити над кортежем за допомогою productIterator
), але оскільки кількість та тип елементів статично відомі, ви, ймовірно, можете просто отримати доступ до елементів кортежу безпосередньо і виконувати операції.
З іншого боку, якщо функція, f
яку ви переглядаєте через список, настільки загальна, що вона приймає всі елементи - питання 3: чому б не використовувати її через productIterator.map
? Гаразд, одна цікава відмінність може виникнути від перевантаження методу: якби у нас було декілька перевантажених f
, наявність більш сильної інформації про тип, надану списком (на відміну від productIterator), могла б дозволити компілятору вибрати більш конкретний f
. Однак я не впевнений, чи справді це діятиме в Scala, оскільки методи та функції не однакові.
Списки HL та введення користувача
Спираючись на те саме припущення, а саме, що вам потрібно статично знати кількість та типи елементів - Питання 4: Чи можна використовувати списки в ситуаціях, коли елементи залежать від будь-якої взаємодії користувача? Наприклад, уявіть, як заповнити список із елементами всередині циклу; елементи зчитуються звідкись (UI, конфігураційний файл, взаємодія актора, мережа), поки не буде виконано певну умову. Яким буде тип списку? Аналогічно специфікації інтерфейсу getElements: HList [...], який повинен працювати зі списками статично невідомої довжини, що дозволяє компоненту А в системі отримувати такий список довільних елементів з компонента B.