比较中2种相似的类型?

时间:2015-02-15 01:04:58

标签: haskell

我有两种类型,Tree和BinTree。我实现比较的方式是这样的:

instance (Eq a) => Ord (Tree a) where
  t <= u = traces t `subseteq` traces u

instance (Eq a) => Eq (Tree a) where
  t == u = traces t `subseteq` traces u && traces u `subseteq` traces t

instance (Eq a) => Ord (BinTree a) where
  t <= u = traces t `subseteq` traces u

instance (Eq a) => Eq (BinTree a) where
  t == u = traces t `subseteq` traces u && traces u `subseteq` traces t

正如您所看到的,我的跟踪功能很高兴在Tree和BinTree上运行,因此我应该有办法: myBinTree&lt; myTree

因此将BinTree与树进行比较

如何实现这一点,以便可以比较BinTrees和Trees,因为BinTree是树的子集。

1 个答案:

答案 0 :(得分:5)

不会成为EqOrd类的实例。这些类具有签名:

(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool

依旧......

您可以编写自己的(==)函数,但之后该函数变得模糊不清,因此您将始终需要指定您实际在谈论的(==)运算符。

您的评论的答案&#34; haskell如何将浮点数与整数进行比较?&#34;是不是没有。如果你写:

> (1 :: Int) == (1.0 :: Float)

<interactive>:56:16:
    Couldn't match expected type `Int' with actual type `Float'
    In the second argument of `(==)', namely `(1.0 :: Float)'
    In the expression: (1 :: Int) == (1.0 :: Float)
    In an equation for `it': it = (1 :: Int) == (1.0 :: Float)

您看到无法完成比较。您可以通过转换:

来完成此操作
> fromIntegral (1 :: Int) == (1.0 :: Float)
True

fromIntegral是一个将Int转换为 - 在这种情况下 - Float的函数。您可以通过实施bin2tree函数来执行相同操作。

您当然可以定义自己的类似课程:

class Similar a b where
    (=~) :: a -> b -> Bool
    (/=~) :: a -> b -> Bool
    (/=~) x y = not $ x =~ y

(并在文件中添加{-# LANGUAGE MultiParamTypeClasses #-}作为修饰符)。

然后例如:

instance (Similar a b) => Similar [a] [b] where
    (=~) [] [] = True
    (=~) _  [] = False
    (=~) [] _  = True
    (=~) (x:xs) (y:ys) = (x =~ y) && (xs =~ ys)

但问题是你必须自己重新定义很多方法(使用像Eq这样的nub),这样才能使用Similar类。