Haskell: фильтрация гетерогенного списка по типу

Мы можем использовать парные последовательности для создания гетерогенных списков в Haskell:

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, ())))

Есть ли способ сделать фильтрацию на уровне типов в этих списках? То есть определите некоторую полиморфную функцию hfilter , такую, чтобы для различных типов a , b и 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 *: () ->  ()
15
задан rampion 22 February 2012 в 13:44
поделиться