已编辑感谢@WillemVanOnsem 的评论。
首先这应该是一个正确的 sum 类型,这样你就可以避免重复 String。意思是,你应该成功
type Animal a = Dog a | Cat a | Fox a
这样您将拥有更通用的 Animal 类型(这是一件好事)。更通用类型的优点之一是它允许您创建更精确的 Animal 类型类实例。
但是,在您的情况下,最简单的方法是派生 Show、Eq,然后像这样编写 Ord 实例:
data Animal = Cat String | Dog String | Fox String deriving (Show, Eq)
instance Ord Animal where
(Cat x) `compare` (Cat y) = x `compare` y
(Cat x) `compare` (Dog y) = x `compare` y
(Cat x) `compare` (Fox y) = x `compare` y
(Dog x) `compare` (Cat y) = x `compare` y
(Dog x) `compare` (Dog y) = x `compare` y
(Dog x) `compare` (Fox y) = x `compare` y
(Fox x) `compare` (Cat y) = x `compare` y
(Fox x) `compare` (Dog y) = x `compare` y
(Fox x) `compare` (Fox y) = x `compare` y
或
data Animal a = Cat a | Dog a | Fox a deriving (Show, Eq)
instance Ord a => Ord (Animal a) where
(Cat x) `compare` (Cat y) = x `compare` y
(Cat x) `compare` (Dog y) = x `compare` y
(Cat x) `compare` (Fox y) = x `compare` y
(Dog x) `compare` (Cat y) = x `compare` y
(Dog x) `compare` (Dog y) = x `compare` y
(Dog x) `compare` (Fox y) = x `compare` y
(Fox x) `compare` (Cat y) = x `compare` y
(Fox x) `compare` (Dog y) = x `compare` y
(Fox x) `compare` (Fox y) = x `compare` y
您可以使用sort,因为现在Animal 有一个Ord 实例
-- sort :: Ord a => [a] -> [a]
sort testAnimals
要点是:使用类型类。这只是简单类型的最简单方法。