手动推导q的类型(在正文中指定)

时间:2014-05-05 20:43:24

标签: haskell types ghci unification

我没有意识到为什么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

在哪种情况下输入类型可能与输出不同?

谢谢,
安。

1 个答案:

答案 0 :(得分:4)

在任何情况下,这意味着:该功能永远不会有用。

这实际上是免费&#34;&#34;定理的一个很好的例子。显然,类型Ord t => [t] -> [a]没有多大意义,因为您可以生成类型[a]的唯一列表(您对a一无所知!)是空列表。所以这证明q只能做两件事:

  • 返回[]
  • 不终止(即

事实上前者就是这样:在每个递归步骤中,您从输入列表中弹出一个元素,但实际上您从未在结果中包含任何这些元素。所以你总是最终得到[]

如果您正确实施了快速排序,您当然会将x带回两个子列表之间,即

q (x:xs) = q us ++ [x] ++ q ws