2012-04-11 19 views
6

タスク:カスタムデータ型を作成してコンソールに出力できるようにしようとしています。私はまた、Haskellの自然順序付けを使ってそれをソートできるようにしたい。Haskellのカスタムデータ型について混乱しています

問題:今、私はこのコードをコンパイルすることはできません。次のエラーが発生します:No instance for (Show Person) arising from a use of 'print'。私がこれまで持って何

は:

-- Omitted working selection-sort function 

selection_sort_ord :: (Ord a) => [a] -> [a] 
selection_sort_ord xs = selection_sort (<) xs 

data Person = Person { 
    first_name :: String, 
    last_name :: String, 
    age :: Int }    

main :: IO() 
main = print $ print_person (Person "Paul" "Bouchon" 21) 

答えて

8

あなたは、印刷可能な表現(String)にタイプを変換するShowインスタンスを必要としています。入手する最も簡単な方法は、タイプ定義に

deriving Show 

を追加することです。

data Person = Person { 
    first_name :: String, 
    last_name :: String, 
    age :: Int } 
     deriving (Eq, Ord, Show) 

最も頻繁に必要なインスタンスを取得する。

あなたの代わりにすることを導出する、コメントで示唆されているように異なるOrdインスタンスは、(あなたがそれらのための異なる振る舞いをしない限りEqShowを導出保つ)

instance Ord Person where 
    compare p1 p2 = case compare (age p1) (age p2) of 
         EQ -> case compare (last_name p1) (last_name p2) of 
           EQ -> compare (first_name p1) (first_name p2) 
           other -> other 
         unequal -> unequal 

または使用のようなインスタンスを提供する場合まず、最後の名前、そして最後に、必要であれば、最初の名前、年齢に応じて比較し、あなたが好む場合compareの定義におけるパターンマッチング、

compare (Person first1 last1 age1) (Person first2 last2 age2) = 
     case compare age1 age2 of 
      EQ -> case compare last1 last2 of 
        EQ -> compare first1 first2 
        other -> other 
      unequal -> unequal 

+0

よろしくお願いいたします。だからEqとOrdはPersonを自然にソートすることができるでしょうか? –

+1

いいえ、 'Ord'インスタンス(' Eq'が必要)では、 'Data.List'の標準の' sort'がソートに利用できます。 –

+0

そして 'selection_sort_ord'(上記)を使ってPersonの項目のリストを年齢の順に並べ替えるために、' instance'キーワードを使って自分自身の 'compare'関数を書いたければ、私のやり方に関する提案この? –

関連する問題