如何使用快速排序按列表中的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)
答案 0 :(得分:1)
您需要使FigureType
具有可比性。最简单的方法是使其派生Eq
和Ord
。
data FigureType = Figure Int Int Int deriving(Show, Read, Ord, Eq)
顺便说一句,Data.List中已经有sort
function。
答案 1 :(得分:1)
简短的回答是,它不知道<
和>=
的含义。你没有在那个节目中告诉过haskell。
要解决此问题,您必须制作instance Ord FigureTye
。我假设您之前已经看过语法。如果没有,您可以查找 haskell类型类。由于Ord
是Eq
的子类,因此您还必须为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