Мы можем использовать парные последовательности для создания гетерогенных списков в 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 *: () -> ()