2011-04-23 78 views
0

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

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) 

回答

1

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

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

BTW,已经有在一个Data.List模块sort function

+0

我不知道函数sort() - 你能告诉我如何使用它通过ID(第一个参数图)对列表进行排序? – mrquestion 2011-04-23 07:15:51

+0

@mrq:'sort x'。 (如果你从'Ord'派生出来,它将按照宽度和高度排列,除了id。) – kennytm 2011-04-23 07:19:37

+0

好的我已经实现了Ord,它的工作原理很多! – mrquestion 2011-04-23 07:33:15

1

简单的答案是它不知道什么<>=的意思。你没有告诉haskell那个程序。

要解决这个问题,您必须制作一个instance Ord FigureTye。我假设你已经看过之前的语法。如果没有,您可以查找haskell类型的类。由于OrdEq的子类,因此您还必须为FigureType创建实例Eq,但是,这可以通过使用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

+0

thx非常! – mrquestion 2011-04-23 07:33:34