我们可以使用对序列在 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
:
<code>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 *: () -> ()
</code>
OverlappingInstances
的版本,通过传递一个过滤器参数,并且使用异构列表作为输出。所以hfilter :: a -> h -> h'
,其中hfilter (undefined :: Int) hlist :: ()
是()
,hfilter (undefined :: Int) hlist :: Int :* ()
是1 :* ()
,而hfilter (undefined :: Int) hlist :: Int :* Int :* ()
是1 :* 2 :* ()
。 - rampionOverlappingInstances
才能实际使用。 - rampion