2011-04-23 81 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