我有两种类型,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是树的子集。
答案 0 :(得分:5)
(==) :: 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
类。