quicksort order by id asc
如何使用快速排序按列表中的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)
您需要使FigureType
具有可比性。最简单的做法是让它派生Eq
和Ord
。
data FigureType = Figure Int Int Int deriving(Show, Read, Ord, Eq)
BTW,已经有在一个Data.List模块sort
function。
简单的答案是它不知道什么<
和>=
的意思。你没有告诉haskell那个程序。
要解决这个问题,您必须制作一个instance Ord FigureTye
。我假设你已经看过之前的语法。如果没有,您可以查找haskell类型的类。由于Ord
是Eq
的子类,因此您还必须为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
thx非常! – mrquestion 2011-04-23 07:33:34
我不知道函数sort() - 你能告诉我如何使用它通过ID(第一个参数图)对列表进行排序? – mrquestion 2011-04-23 07:15:51
@mrq:'sort x'。 (如果你从'Ord'派生出来,它将按照宽度和高度排列,除了id。) – kennytm 2011-04-23 07:19:37
好的我已经实现了Ord,它的工作原理很多! – mrquestion 2011-04-23 07:33:15