Sono davvero interessato a scoprire dove sono le differenze e, più in generale, per identificare i casi d'uso canonici in cui gli elenchi HL non possono essere utilizzati (o meglio, non producono alcun vantaggio rispetto agli elenchi regolari).
(Sono consapevole che ci sono 22 (credo) TupleN
in Scala, mentre uno ha bisogno solo di una singola HList, ma non è questo il tipo di differenza concettuale a cui sono interessato.)
Ho segnato un paio di domande nel testo qui sotto. In realtà potrebbe non essere necessario rispondere loro, sono più pensati per sottolineare cose che non sono chiare per me e per guidare la discussione in determinate direzioni.
Motivazione
Di recente ho visto un paio di risposte su SO in cui le persone hanno suggerito di utilizzare HList (ad esempio, come fornito da Shapeless ), inclusa una risposta eliminata a questa domanda . Ha dato origine a questa discussione , che a sua volta ha suscitato questa domanda.
Intro
Mi sembra che le liste siano utili solo quando si conosce staticamente il numero di elementi e i loro tipi precisi. Il numero in realtà non è cruciale, ma sembra improbabile che tu abbia mai bisogno di generare un elenco con elementi di tipi diversi ma staticamente noti con precisione, ma che non conosci staticamente il loro numero. Domanda 1: potresti persino scrivere un esempio del genere, ad esempio in un ciclo? La mia intuizione è che avere un hlist staticamente preciso con un numero staticamente sconosciuto di elementi arbitrari (arbitrario rispetto a una determinata gerarchia di classi) non è compatibile.
HLists vs. Tuples
Se questo è vero, cioè conosci staticamente numero e tipo - Domanda 2: perché non usare semplicemente una n-tupla? Certo, puoi tipicamente mappare e piegare su una HList (che puoi anche, ma non tipicamente, fare su una tupla con l'aiuto di productIterator
), ma poiché il numero e il tipo degli elementi sono staticamente noti, probabilmente potresti semplicemente accedere agli elementi tupla direttamente ed eseguire le operazioni.
D'altra parte, se la funzione f
mappata su una hlist è così generica da accettare tutti gli elementi - Domanda 3: perché non utilizzarla tramite productIterator.map
? Ok, una differenza interessante potrebbe derivare dal sovraccarico del metodo: se avessimo diversi sovraccarichi f
, avere le informazioni di tipo più forte fornite dall'hlist (contrariamente al productIterator) potrebbe consentire al compilatore di scegliere uno più specifico f
. Tuttavia, non sono sicuro che funzionerebbe effettivamente in Scala, poiché i metodi e le funzioni non sono gli stessi.
HList e input dell'utente
Basandosi sullo stesso presupposto, vale a dire, è necessario conoscere staticamente il numero e i tipi di elementi - Domanda 4: è possibile utilizzare le liste in situazioni in cui gli elementi dipendono da qualsiasi tipo di interazione dell'utente? Ad esempio, immagina di popolare una lista con elementi all'interno di un ciclo; gli elementi vengono letti da qualche parte (UI, file di configurazione, interazione attore, rete) fino a quando una determinata condizione rimane valida. Quale sarebbe il tipo di hlist? Simile per una specifica di interfaccia getElements: HList che [...] dovrebbe funzionare con elenchi di lunghezza staticamente sconosciuta e che consente al componente A in un sistema di ottenere tale elenco di elementi arbitrari dal componente B.