对Haskell中的自定义数据类型感到困惑

对Haskell中的自定义数据类型感到困惑,haskell,types,Haskell,Types,任务:我正在尝试创建自定义数据类型,并使其能够打印到控制台。我还希望能够使用Haskell的自然排序对其进行排序 问题:立即编写,我无法编译此代码。它抛出以下错误:没有因使用“print”而产生的(Show Person)实例。 到目前为止我拥有的: -- Omitted working selection-sort function selection_sort_ord :: (Ord a) => [a] -> [a] selection_sort_ord xs = select

任务:我正在尝试创建自定义数据类型,并使其能够打印到控制台。我还希望能够使用Haskell的自然排序对其进行排序

问题:立即编写,我无法编译此代码。它抛出以下错误:
没有因使用“print”而产生的(Show Person)实例。

到目前为止我拥有的:

-- 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)
——省略了工作选择排序功能
选择排序顺序:(顺序a)=>[a]->[a]

selection_sort_ord xs=selection_sort(您需要一个
Show
实例来将类型转换为可打印的表示形式(一个
字符串

deriving Show
添加到类型定义

data Person = Person { 
    first_name :: String, 
    last_name :: String,   
    age :: Int }
      deriving (Eq, Ord, Show)
获取最常用的实例

如果您想要一个不同的
Ord
实例,如注释中所建议的,而不是派生该实例(继续派生
Eq
Show
,除非您想要这些不同的行为),请提供如下实例

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 (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

这将首先根据年龄进行比较,然后根据姓氏进行比较,如果需要的话,最后根据名字进行比较。

很酷,谢谢。因此Eq和Ord将允许对人进行自然排序?是的,有一个
Ord
实例(需要
Eq
),标准的
sort
from
Data.List
可用于排序。问题是如何编写
compare
函数?这取决于您希望如何比较
Person
s;如果您希望按姓氏然后按姓氏排序,例如忽略年龄,您可以(导入
Control.Arrow
Data.Function
后)执行
实例Ord Person where compare=compare`on`(姓氏和姓氏)
选择排序
不允许任何自定义,它获取一个列表并对其执行操作,好吧,无论
选择排序
通过比较后执行什么操作
(为什么没有人提到
mappend
?你可以这样写:
let()=mappend in compare age1 age2 compare last2 compare first1 first2