2011-04-23 20 views
0

クイックソートを使用して、リストの昇順に並べ替えて要素を表示するにはどうすればよいですか?私はエラーがあります:インスタンスはありません(Ord Figure Type)。私のコード:クイックソートorderby 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) 

ところで、Data.Listでsort functionはすでに存在しています。

+0

私は関数sort()について知りませんでした。あなたはIDでリストをソートするためにどのように使うことができますか? – mrquestion

+0

@mrq: 'sort x'。 (もしあなたが 'Ord'から派生すれば、id以外にも幅と高さで注文します) – kennytm

+0

ok私はOrdを実装しました。 – mrquestion

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

ここでは、タイプクラスに関する実世界のハズケルの章があります。しかし、Ordのインスタンスは含まれません。 http://book.realworldhaskell.org/read/using-typeclasses.html

+0

thx非常に! – mrquestion