我没有意识到为什么q
的类型是Ord t => [t] -> [a]
而不是Ord a => [a] -> [a]
q [] = []
q (x:xs) = q us ++ q ws
where us = filter (<=x) xs
ws = filter (>=x) xs
在哪种情况下输入类型可能与输出不同?
谢谢,
安。
答案 0 :(得分:4)
在任何情况下,这意味着:该功能永远不会有用。
这实际上是免费&#34;&#34;定理的一个很好的例子。显然,类型Ord t => [t] -> [a]
没有多大意义,因为您可以生成类型[a]
的唯一列表(您对a
一无所知!)是空列表。所以这证明q
只能做两件事:
[]
⟂
)事实上前者就是这样:在每个递归步骤中,您从输入列表中弹出一个元素,但实际上您从未在结果中包含任何这些元素。所以你总是最终得到[]
。
如果您正确实施了快速排序,您当然会将x
带回两个子列表之间,即
q (x:xs) = q us ++ [x] ++ q ws