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 maps Boost.Fusion?

È stato utile?

Soluzione

Guardate la href="http://hackage.haskell.org/package/dependent-map" rel="noreferrer" title="dependent-map"> dipendente-map pacchetto TypeRep come chiave, invece.

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]).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top