quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerOrEqual = [a | a <- xs, a <= x]
larger = [a | a <- xs, a > x]
in quicksort smallerOrEqual ++ [x] += larger
main = do
a = [ 5, 1, 9, 4, 6, 7, 3]
print quicksort a
我收到了这个错误:
[1 of 1] Compiling Main ( quicksort.hs, quicksort.o )
quicksort.hs:10:11: parse error on input `='
真的不明白为什么。双重检查此代码几次。仍然令人困惑。 需要帮忙。 谢谢!
答案 0 :(得分:4)
在do
个区块内,绑定必须以let
关键字开头,因此该行应为let a = [ 5, 1, 9, 4, 6, 7, 3]
。
但是还有一些其他错误。您似乎错误输入了++
运算符,而您忘记对列表的较大部分进行排序。您的打印声明无法正常工作,因为print quicksort a
被解析为将函数quickSort
和值a
传递给print
。您可以使用括号或函数应用程序运算符($
)轻松解决此问题。这段代码完美无缺:
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerOrEqual = [a | a <- xs, a <= x]
larger = [a | a <- xs, a > x]
in quicksort smallerOrEqual ++ [x] ++ quickSort larger
main = do
let a = [ 5, 1, 9, 4, 6, 7, 3]
print $ quicksort a
答案 1 :(得分:3)
您忘记了let
,
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerOrEqual = [a | a <- xs, a <= x]
larger = [a | a <- xs, a > x]
in quicksort smallerOrEqual ++ [x] ++ quicksort larger -- ++ not +=
main = do
let a = [ 5, 1, 9, 4, 6, 7, 3]
print (quicksort a) -- The parens are needed too
我也解决了其他一些错误。
值得注意的是,这个快速排序并不合适,因此它并不是真正的快速排序,尽管很漂亮。