键入检查自定义函数

时间:2012-06-01 14:26:55

标签: haskell

我有这个功能:

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,但我认为它不会改变任何东西。

1 个答案:

答案 0 :(得分:11)

类型Ord a => [a] -> [b]在内部是一致的!

问题是您实际上从未将输入列表中的任何元素添加到输出列表中。你需要一个基础案例;像foo [x] = [x]这样的东西。实际上,您实际上从未说过输入列表中的任何元素都会添加到输出列表中;此函数的结果始终为[],无论输入如何,都可以使用[b]类型。

如果您尝试在此处实施Quicksort之类的操作,那么您的实现中存在两个逻辑问题:

  1. x,即枢轴,不会添加到输出列表中。
  2. 列表中除x以外x以外的任何值都将添加两次,一次来自us,一次来自ys