Haskell中如何按日期优先、水果类型次之排序Fruit列表?
要实现你需要的排序规则,只需修改Ord Fruit实例的compare逻辑:先按日期比较,当日期相同时,再根据水果类型的优先级(Apple > Balana > Orange)进行比较。
有两种常见实现方式:
方式一:借助优先级辅助函数
先给每种水果类型分配一个优先级数值,数值越小优先级越高,然后在比较时先比日期,日期相等则比优先级:
-- 新增辅助函数,返回水果的优先级 getFruitPriority :: Fruit -> Int getFruitPriority Apple{} = 0 getFruitPriority Balana{} = 1 getFruitPriority Orange{} = 2 instance Ord Fruit where compare f1 f2 = let dateComp = compare (getDate f1) (getDate f2) in if dateComp == EQ then compare (getFruitPriority f1) (getFruitPriority f2) else dateComp
方式二:直接通过模式匹配比较类型
这种方式更直观,直接针对不同水果类型的组合定义比较规则:
instance Ord Fruit where -- 同类型水果直接比日期 compare (Apple d1) (Apple d2) = compare d1 d2 compare (Balana d1) (Balana d2) = compare d1 d2 compare (Orange d1) (Orange d2) = compare d1 d2 -- Apple比其他所有类型优先级高 compare (Apple _) _ = LT compare _ (Apple _) = GT -- Balana比Orange优先级高 compare (Balana _) _ = LT compare _ (Balana _) = GT
两种方式都能实现你要的排序效果:日期相同的情况下,Apple排在最前,其次是Balana,最后是Orange。测试你的列表f,排序后会得到你预期的结果。
内容的提问来源于stack exchange,提问作者Shawn Zhang
相关产品推荐
相关产品推荐

