我正在尝试使用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 []
答案 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