异质列表我们可以利用对序列在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 *:() -> ()
对不起编译问题,我是从我的电话发帖。 – rampion 2012-02-22 14:44:43
好吧,我可以从这里得到[通过传递过滤参数不需要'OverlappingInstances'的版本](https://gist.github.com/1885439)'hfilter :: a - > h - > h'',并为输出使用不同的列表。所以'hfilter(undefined :: Int)hlist ::()'是'()','hfilter(undefined :: Int)hlist :: Int:*()'是'1:*()'和'hfilter undefined :: Int)hlist :: Int:* Int:*()'是'1:* 2:*()'。 – rampion 2012-02-22 15:02:39
arg,但需要'OverlappingInstances'来实际使用。 – rampion 2012-02-22 20:19:11