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 回答