Мне действительно интересно узнать, где различия и, в более общем плане, определить канонические варианты использования, когда HLists нельзя использовать (точнее, не приносить никаких преимуществ по сравнению с обычными списками).
(Я знаю, что есть 22 (я считаю) TupleN
в Scala, тогда как для одного требуется только один HList, но это не та концептуальная разница, в которой меня интересует.)
Я отметил пару вопросов в тексте ниже. На самом деле не обязательно отвечать на них, они больше предназначены для того, чтобы указывать на то, что мне непонятно, и вести дискуссию в определенных направлениях.
Мотивация
Недавно я увидел пару ответов на SO, где люди предлагали использовать HLists (например, как это предусмотрено Shapeless), включая удаленный ответ на этот вопрос. Это вызвало эту дискуссию, что, в свою очередь, вызвало этот вопрос.
Введение
Мне кажется, что hlists полезны только тогда, когда вы знаете количество элементов и их точные типы статически. Число фактически не имеет решающего значения, но маловероятно, что вам когда-либо понадобится генерировать список с элементами различного, но статически точно известных типов, но вы не статически узнаете их число. Вопрос 1: Не могли бы вы даже написать такой пример, например, в цикле? Моя интуиция заключается в том, что наличие статически точного hlist со статически неизвестным числом произвольных элементов (произвольных относительно данной иерархии классов) просто несовместимо.
HLists против кортежей
Если это верно, т.е. вы статически знаете число и тип - Вопрос 2:, почему бы просто не использовать n-кортеж? Несомненно, вы можете набросать карты и свернуть их поверх HList (которые вы также можете использовать, но не), сделать по кортежу с помощью productIterator
), но поскольку число и тип элементов Статически известно, что вы, вероятно, можете просто напрямую обращаться к элементам кортежа и выполнять операции.
С другой стороны, если функция f
, отображаемая по hlist, является настолько общей, что принимает все элементы - Вопрос 3:, почему бы не использовать ее через productIterator.map
? Хорошо, одна интересная разница может возникнуть в результате перегрузки метода: если у нас было несколько перегруженных f
, то более сильная информация о типе, предоставленная hlist (в отличие от productIterator), могла позволить компилятору выбрать более конкретный f
, Однако я не уверен, действительно ли это работает в Scala, поскольку методы и функции не совпадают.
HLists и пользовательский ввод
Основываясь на том же предположении, а именно, что вам нужно знать число и типы элементов статически - Вопрос 4: могут использоваться hlists в ситуациях, когда элементы зависят от любого взаимодействия пользователя? Например, представьте, что вы заполняете hlist элементами внутри цикла; элементы читаются где-то (пользовательский интерфейс, файл конфигурации, взаимодействие с актером, сеть) до тех пор, пока не будет выполнено определенное условие. Каким будет тип hlist? Аналогично для спецификации интерфейса getElements: HList [...], которая должна работать со списками статически неизвестной длины и которая позволяет компоненту A в системе получить такой список произвольных элементов из компонента B.