J'espère que le titre provocateur qui a retenu votre attention :-) Malgré la première impression que cela peut laisser, je suis vraiment intéressé à trouver où les différences sont, et plus généralement, pour identifier canonique cas d'utilisation où les hlist ne peut pas être utilisé (ou plutôt, ne produisent pas tous les avantages régulier sur les listes).
(Afin de ne pas perdre de temps et d'efforts: je suis conscient qu'il y a 22 (je crois) TupleN
en Scala, alors que l'on a seulement besoin d'un seul HList, mais ce n'est pas le genre de différence conceptuelle qui m'intéressent.)
J'ai marqué un couple de questions dans le texte ci-dessous. Il pourrait ne pas être nécessaire pour y répondre, ils sont plus à indiquer des choses qui ne sont pas claires pour moi, et pour orienter la discussion dans certaines directions.
La Motivation
J'ai récemment vu un couple de réponses sur la DONC, où les gens ont proposé d'utiliser les hlist (par exemple, tel que prévu par Informes), y compris une réponse à cette question (Remarque: la réponse a malheureusement été supprimé, maintenant). Elle a donné lieu à cette discussion, qui à son tour a déclenché cette question.
Intro
Il me semble, que les hlist ne sont utiles que si vous connaissez le nombre d'éléments et de leur précise les types de manière statique. Le nombre est en fait pas indispensable, mais il semble peu probable que jamais vous avez besoin de générer une liste avec des éléments de la variable, mais de manière statique précisément les types connus, mais que vous n'avez pas de manière statique connaître leur nombre. Question 1: Pourriez-vous même écrire un tel exemple, par exemple, dans une boucle? Mon intuition est que le fait d'avoir une statique précis hlist avec un statiquement nombre inconnu de l'arbitraire des éléments (arbitraire par rapport à une hiérarchie de classe) n'est tout simplement pas compatible.
Les hlist vs n-Uplets
Si cela est vrai, je.e, vous statiquement connaître le nombre et le type - Question 2: pourquoi ne pas simplement utiliser un n-tuple? Bien sûr, vous pouvez typesafely map et fold sur un HList (que vous pouvez également, mais pas typesafely, faire sur un tuple avec l'aide d' productIterator
), mais depuis le nombre et le type des éléments de manière statique sait, vous pourriez juste l'accès au n-uplet d'éléments directement et effectuer les opérations.
D'autre part, si la fonction f
vous carte sur une hlist est tellement générique qu'il accepte tous les éléments - Question 3: pourquoi ne pas l'utiliser via productIterator.map
? Ok, une différence intéressante pourrait venir de la surcharge de méthode: si nous avons eu plusieurs surchargé f
s', qui a la plus forte type d'informations fournies par le hlist (contrairement à l'productIterator) pourrait permettre au compilateur de choisir plus spécifiques, f
. Cependant, je ne suis pas sûr si cela fonctionne réellement en Scala, puisque les méthodes et les fonctions ne sont pas les mêmes.
Les hlist et la saisie de l'utilisateur
Sur la même hypothèse, à savoir que vous besoin de connaître le nombre et les types des éléments de la statique - Question 4: pouvez les hlist être utilisé dans les situations où les éléments dépendent de tout type d'interaction de l'utilisateur? E. g., imaginez le remplissage d'un hlist avec des éléments à l'intérieur d'une boucle; les éléments sont lues à partir de quelque part (l'INTERFACE utilisateur, le fichier de config, acteur de l'interaction, réseau) jusqu'à ce qu'une certaine condition est vraie. Quel serait le type de la hlist être? Similaire pour une spécification d'interface getElements: HList[...] qui doivent travailler avec des listes de statiquement longueur inconnue, et qui permet à Un composant dans un système pour obtenir une liste de l'arbitraire des éléments de composant B.