使用foldr haskell实现冒泡排序

时间:2017-05-08 21:04:39

标签: haskell

我正在尝试使用foldr实现冒泡排序,但我不断收到错误消息,说明类型不匹配,我不明白为什么。 这是我的代码:

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

bubbleSorting :: (Ord a) => [a] -> [a]
bubbleSorting = foldr bubble []

2 个答案:

答案 0 :(得分:1)

您的bubble函数会将x大致插入已排序列表y:xs。如果我们将第一个模式匹配从[x]更改为等效(x:[]),您可以看到bubble始终采用值x和列表的其余部分(列表正在列表中)插入,[]y:xs

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

通过删除:与其插入列表之间的x构造函数,可以转换为一个带两个参数的函数。

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

这很好;它使bubble成为一个完整的功能。它已不再在[]上未定义,并且与foldr兼容。

bubble中仍然存在逻辑错误。我建议你试试bubbleSorting [10,9..1]。你可能会对结果感到惊讶。

如果您不想更改bubble的签名,则可以在bubble' x ys = bubble (x:ys)中定义bubble'并使用foldr

答案 1 :(得分:0)

我猜您可以使用bubbleSort实现foldr功能,如下所示;

bubbleSort :: Ord a => [a] -> [a]
bubbleSort xs = foldr bubble [] xs
                where
                bubble x []     = [x]
                bubble x (y:ys) | x < y     = x:y:ys
                                | otherwise = y:bubble x ys