我有这个功能:
foo [] = []
foo (x:xs) = foo us ++ foo ys
where us = filter (<=x) xs
ys = filter (>=x) xs
此函数的类型是Ord a =&gt; [a] - &gt; [b]。
我不明白为什么输出类型是[b]而不是[a]。我认为它应该是[a],因为输出列表的元素将成为输入列表元素的一部分。
我正在使用Hugs,但我认为它不会改变任何东西。
答案 0 :(得分:11)
类型Ord a => [a] -> [b]
在内部是一致的!
问题是您实际上从未将输入列表中的任何元素添加到输出列表中。你需要一个基础案例;像foo [x] = [x]
这样的东西。实际上,您实际上从未说过输入列表中的任何元素都会添加到输出列表中;此函数的结果始终为[]
,无论输入如何,都可以使用[b]
类型。
如果您尝试在此处实施Quicksort之类的操作,那么您的实现中存在两个逻辑问题:
x
,即枢轴,不会添加到输出列表中。x
以外x
以外的任何值都将添加两次,一次来自us
,一次来自ys
。