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允许这个)”。有什么办法可以将列表声明为整数列表吗?
答案 0 :(得分:0)
模式(x:y:xs)
与以x
和y
开头的列表匹配,并继续尾xs
。因此,它仅与具有至少长度为2的列表匹配。必须考虑其他情况,否则该函数将是部分函数,并且一旦满足短列表,它将在运行时崩溃。
解决这个问题的一种可能方法是添加两个丢失的案例:
bubblesort (x:[]) = x:[] -- length 1
bubblesort [] = [] -- length 0
但最后只添加一个案例
更简单bubblesort xs = xs
其中xs
是上述案例未处理的任何列表,即长度小于2的列表。
类型签名bubblesort :: (Ord Int) => [Int] -> [Int]
有点奇怪。它声明"如果可以对整数进行排序,则bubblesort
具有类型..."。我们知道整数可以订购,没有必要这样做。如果您真的想要更精确的签名,请使用
bubblesort :: [Int] -> [Int]
(但更普遍的签名有什么问题?我坚持那个)