快速排序由id asc

时间:2011-04-23 06:57:55

标签: haskell

如何使用快速排序按列表中的ID升序排序,然后显示元素?我有错误:没有(Ord FigureType)的实例。我的代码是:

showRectangles [] = "No rectangles"
showRectangles x = concat (map showRectangle (qsort x))

showRectangle :: FigureType -> String
showRectangle (Figure id width height) = "id: " ++ show id ++ " width: " ++ show width ++ " height: " ++ show height ++ "\n";

data FigureType = Figure Int Int Int deriving(Show, Read)

qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

2 个答案:

答案 0 :(得分:1)

您需要使FigureType具有可比性。最简单的方法是使其派生EqOrd

data FigureType = Figure Int Int Int deriving(Show, Read, Ord, Eq)

顺便说一句,Data.List中已经有sort function

答案 1 :(得分:1)

简短的回答是,它不知道<>=的含义。你没有在那个节目中告诉过haskell。

要解决此问题,您必须制作instance Ord FigureTye。我假设您之前已经看过语法。如果没有,您可以查找 haskell类型类。由于OrdEq的子类,因此您还必须为Eq创建实例FigureType,但是,这可以通过使用deriving(Show, Read, Eq)来派生。你也可以写deriving(Show, Read, Eq, Ord)。但是Ord的自动生成的实例可能不是您想到的实现。


这是与Ord类型类的链接,它表示您必须实现的最少量的函数。 http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#t:Ord

这是关于类型类的真实世界haskells章节。但它并未涵盖Ord的任何实例。 http://book.realworldhaskell.org/read/using-typeclasses.html