Possiamo usare sequenze di coppia per creare liste eterogenee in Haskell:Haskell: filtrare una lista eterogenea per tipologia
type a *: b = (a, b)
a *: b = (a, b)
infixr 5 *:
hlist :: Int *: String *: Maybe Float *:()
hlist = 1 *: "hello" *: Just 3 *:() -- (1, ("hello", (Just 3,())))
Esiste un modo che possiamo fare il filtraggio di tipo a livello su queste liste? Cioè, definire qualche funzione polimorfica hfilter
tale che per i tipi distinti a
, b
e c
:
hfilter :: a *: b *: c *: a *: b *: a *:() -> a *: a *: a *:()
hfilter :: a *: b *: c *: a *: b *: a *:() -> b *: b *:()
hfilter :: a *: b *: c *: a *: b *: a *:() -> c *:()
hfilter :: a *: b *: c *: a *: b *: a *:() -> ()
Mi dispiace per i problemi di compilazione, stavo postando dal mio telefono. – rampion
Ok, sono riuscito a ottenere da [una versione che non richiede 'OverlappingInstances' passando un argomento filtro] (https://gist.github.com/1885439)' hfilter :: a -> h - > h'', che utilizza liste eterogenee per l'output. Quindi 'hfilter (undefined :: Int) hlist ::()' è '()', 'hfilter (undefined :: Int) hlist :: Int: *()' è '1: *()' e 'hfilter (undefined :: Int) hlist :: Int: * Int: *() 'è' 1: * 2: *() '. – rampion
arg, ma per utilizzare effettivamente 'OverlappingInstances'. – rampion