6

タスク:カスタム データ型を作成して、コンソールに出力できるようにしようとしています。また、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)
4

1 に答える 1

9

Show型を印刷可能な表現 (a ) に変換するには、インスタンスが必要ですString。取得する最も簡単な方法は、追加することです

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

これは、最初に年齢、次に姓、最後に必要に応じて名に従って比較されます。

于 2012-04-11T22:50:10.437 に答える