在冒泡排序中实现第一次传递

时间:2017-04-24 09:34:02

标签: algorithm haskell

bubblesort :: (Ord a) => [a] -> [a]
bubblesort (x:y:xs)
    | x > y = y : bubblesort (x:xs)
    | otherwise = x : bubblesort (y:xs)
bubblesort (x) = (x)

1.我不明白代码的最后一行;我试图对其进行评论并且编译器说“函数bubblesort中的非穷举模式”,当我尝试将其移动到代码的第一行时,编译说“模式匹配是多余的”。它使用圆括号的方式使我感到困惑。

2.我试图将类型声明更改为bubblesort ::(Ord Int)=> [Int] - > [Int]和我得到另一个错误“约束中的非类型变量参数:Ord Int(使用FlexibleContexts允许这个)”。有什么办法可以将列表声明为整数列表吗?

1 个答案:

答案 0 :(得分:0)

  1. 模式(x:y:xs)与以xy开头的列表匹配,并继续尾xs。因此,它仅与具有至少长度为2的列表匹配。必须考虑其他情况,否则该函数将是部分函数,​​并且一旦满足短列表,它将在运行时崩溃。

    解决这个问题的一种可能方法是添加两个丢失的案例:

    bubblesort (x:[]) = x:[]   -- length 1
    bubblesort [] = []         -- length 0
    

    但最后只添加一个案例

    更简单
    bubblesort xs = xs
    

    其中xs是上述案例未处理的任何列表,即长度小于2的列表。

  2. 类型签名bubblesort :: (Ord Int) => [Int] -> [Int]有点奇怪。它声明"如果可以对整数进行排序,则bubblesort具有类型..."。我们知道整数可以订购,没有必要这样做。如果您真的想要更精确的签名,请使用

    bubblesort :: [Int] -> [Int]
    

    (但更普遍的签名有什么问题?我坚持那个)