代码之家  ›  专栏  ›  技术社区  ›  Mantas Vidutis

为数据类型定义自己的ORD

  •  27
  • Mantas Vidutis  · 技术社区  · 16 年前

    我正试图制作一些数据结构来解决一个图形难题。我试图定义一个边缘的比较标准,但我不确定如何定义。到目前为止:

    data Edge = Edge (Set String) Bool
    

    如果边缘具有相同的字符串集,并且不具有相等性,那么如何“通知”编译器我希望边缘被声明为相等,这与布尔值有任何关系?

    2 回复  |  直到 7 年前
        1
  •  45
  •   Antal Spector-Zabusky    16 年前

    虽然我不知道为什么你要忽略布尔值(我很好奇),但要做到这一点,你必须定义自己的 Eq 实例;默认值将不起作用,因为它比较每个字段。幸运的是,这很容易:

    instance Eq Edge where
      (Edge s1 _) == (Edge s2 _) = s1 == s2
    

    如果您希望能够对边进行排序,并且希望排序也只比较集合,那么您的实现非常类似:

    instance Ord Edge where
      (Edge s1 _) `compare` (Edge s2 _) = s1 `compare` s2
    

    每个类型类定义了一组需要实现的方法; 情商 要求 == /= Ord 要求 <= compare . (为了找出哪些功能是必需的,哪些是可选的,您可以检查文档。)

        2
  •  15
  •   Thomas M. DuBuisson    16 年前
    import Data.Set
    
    data Edge = Edge (Set String) Bool deriving Show
    
    instance Eq Edge where
        (Edge a _) == (Edge b _) = a == b
    
    instance Ord Edge where
        compare (Edge a _) (Edge b _) = compare a b
    
    推荐文章