尝试推导eq时出现错误。我怎样才能解决这个问题?

时间:2019-04-27 11:33:35

标签: haskell

我收到此错误:

  • (Eq T1)没有实例     由TT' (type矩阵T1'的第一个字段产生)   可能的解决方法:     使用独立的“派生实例”声明,       因此您可以自己指定实例上下文
    • 为(Eq TT)导出实例时 | 20 | }派生(Eq,Ord)

而且我不知道为什么以及如何解决此问题(Ord的错误相同)

这是我的代码:

import Data.Matrix
data T1 = T1 { x :: Char
             , y :: Int 
             , z :: Int 
             }
instance Show T1 where
    show t1 = [(x t1)] 

data TT = TT { myMap :: Matrix T1
             , flag :: Int
             } deriving (Eq, Ord)

有什么主意吗?

1 个答案:

答案 0 :(得分:4)

在您的示例中,类型TT的值包含类型T1的值;因此,要使两个TT类型的值相等,您还需要知道如何使两个T1类型的值相等。但是您尚未为Eq定义一个T1实例!向deriving (Eq)添加T1子句,错误将消失。 Ord也是如此。

通常,如果您有一个类型A,其中包含一个类型为B的值,则要在A上派生一个类型类,则需要在该类型上派生相同的类型类。 B。如上所述,发生这种情况是因为为了在A上实现该类型类的方法,您需要已经知道该类型类在B上的行为,例如除非您知道A的值是相等的,否则您不能将B的值等同(上面的示例)。另一个示例:如果您想将A类型的值显示为String,则需要能够将B转换为字符串。