You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:30:44