【发布时间】:2017-03-05 01:58:49
【问题描述】:
我尝试在 Haskell 中编写一个快速排序,我知道那里有很多版本。
这个对于 Int 类型来说非常简单
quickSort1::[Int]->[Int]
quickSort1 [] = []
quickSort1 (x:xs) = [l | l <- xs, l < x] ++ [x] ++ [ r | r <- xs, r > x]
我可以在 Main 上打印如下
print $ quickSort1 [] -- output []
print $ quickSort1 [2, 1] -- output [1, 2]
我将上面的 quickSort1 修改为使用 (Ord a) 而不是 Int 的“更通用”类型
quickSort2::(Ord a)=>[a]->Maybe [a]
quickSort2 [] = Nothing
quickSort2 (x:xs) = Just $ [ l | l <- xs, l < x] ++ [x] ++ [ r | r <- xs, r > x]
在我的 Main 上,我可以运行
有效
print $ quickSort2 [2, 1] -- output [1, 2]
我在运行时遇到编译器错误
print $ quickSort2 [] -- got error
谁能向我解释一下我的新版 quickSort2 发生了什么
【问题讨论】:
-
“谁能向我解释一下我的新版 quickSort2 发生了什么?”——没什么好担心的。如果您再次阅读错误(并且您应该将错误添加到此处的问题中,在这种情况下 - 它使每个人的事情变得更容易!),您可能会发现(我猜)它基本上是在说它没有不知道空列表应该具有哪种类型。如果我是对的,
print $ quickSort2 ([] :: [Int])不会导致错误,并且当你在程序的其余部分中使用它时,你的函数会正常工作,只要你给东西类型签名。 -
顺便问一下,您使用的是哪个版本的 GHC? (如果您不知道,请在终端中运行
ghc --version。) -
附注 - 我希望您知道您的快速排序实现不正确
quicksort1 [10,9..1] /= [1..10],quicksort1 [5,5,5]也是如此。我正在使用 ghc 8.0.1 和 7.10.3,我无法重现任何错误!为您的第二个快速排序版本 -
Glorious Glasgow Haskell 编译系统,版本 7.10.3
-
1) 您的 quickSort 没有任何递归调用。这肯定是错误的。 2)永远不要在不发布错误的情况下说“我遇到错误”!它可能对你没用,但对潜在的回答者来说很宝贵。 3)为什么可能?我希望排序总是返回一个列表...
标签: haskell