Haskell equivalente di Boost.Fusion
-
25-10-2019 - |
Domanda
Ho giocato con la creazione di un DSEL completamente digitato in Haskell utilizzando GADTs e così per un AST completamente type-safe, e sembra che fare un compilatore digitato correttamente richiede costrutti come le mappe da tipi Haskell a entrambi i tipi e valori ( ambienti digitati) e in modo tale che possono essere comprese dal sistema di tipo Haskell. C ++ ha la libreria Boost.Fusion con costrutti come questi (mappe del tipo> di valore, vettori di valori digitati, etc.). Data.Tuple si prende cura di sequenze, ma ci sono versioni Haskell di cose come map
s Boost.Fusion?
Soluzione
Guardate la href="http://hackage.haskell.org/package/dependent-map" rel="noreferrer" title="dependent-map"> dipendente-map pacchetto
Altri suggerimenti
In primo luogo, la risposta fin troppo evidente è che si può facilmente scrivere un "tipo-> mappa valore" utilizzando Typeable
(parte della libreria di base):
import Data.Typeable
import Data.Map
type TypeMap a = Map TypeRep a
insertT :: Typeable k => k -> a -> Map k a -> Map k a
insertT v = insert (typeOf k)
lookupT :: Typeable k => k -> a -> Map k a -> Map k a
lookupT v = lookup (typeOf k)
Ora è possibile utilizzare il codice come insertT (undefined :: Int) 5
di inserire elementi per tipo.
Ma guardando Fusion, questo in realtà non sembra quello che si potrebbe essere dopo. Sembra che consente di costruire il codice a lavorare su strutture di dati arbitrari? Questo è qualcosa che in Haskell è noto come "Scrap tua Boilerplate" programmazione generica. Vedere la carte o hackage per i dettagli, ma ti permette di scrivere il codice che i processi arbitrari strutture e picconi dati dei valori di determinati tipi
A poche altre cose che ho visto di fusione potrebbe probabilmente essere emulata utilizzando librerie come HList o, eventualmente, fclabels . Ma è davvero è difficile dire di più senza uno sguardo a ciò che è effettivamente necessario.
Come accennato in precedenza, dependent-map
sembra la scelta giusta per il lato mappa di cose, ma io consiglierei di guardare il HArray
interfaccia di hlist
come alternativa alla tuple di manipolazione manuale.
Sei alla ricerca di Data.Map , e le liste? (Ad esempio [Int]
).