【发布时间】:2014-07-01 05:33:30
【问题描述】:
我的作业中定义了以下内容:
type Rel a = Set (a,a)
complR :: Ord a => Set a -> Rel a -> Rel a
complR (Set xs) r = Set [(x,y) | x <- xs, y <- xs, not (inR r (x,y))]
集合类型可以这样调用,例如:(Set [(1,2)])。 当我尝试像这样调用函数时,我收到“无法推断实例”错误。我很确定这是因为我的电话和具体的 Rel a。 inR 也在作业中定义,我在这里没有包括在内。
我做错了什么?例如,我这样称呼它:
complR (Set [(5,4), (3,3)]) (Set [(1,3)])
谢谢!
编辑: 我不认为作业是使用 Data.Set。我不认为包括在内。我看到了数据列表。但是我确实看到了:newtype Set a = Set [a] deriving (Eq,Ord)。 inR 的类型是这样的:Ord a => Rel a -> (a,a) -> Bool。 此作业中使用的文件是http://www.cwi.nl/~jve/rcrh/REL.hs 和 http://www.cwi.nl/~jve/rcrh/SetOrd.hs。
函数 complR 被放置在 REL.hs 文件中。 我调用 complR 时得到的错误是:
ERROR - Cannot infer instance
*** Instance : Num (b,a)
*** Expression : complR (Set [(5,4),(3,3)]) (Set [(1,3)])
【问题讨论】:
-
你在使用
Data.Set吗?您可以发布您收到的确切错误消息吗? GHC 的错误消息通常非常有用,并且包含有助于诊断问题的上下文信息。可以包含inR的类型吗?我认为它类似于inR :: Ord a => Rel a -> (a, a) -> Bool,但很难确定。 -
它看起来好像你正在使用一些
Set实现,它被定义为只不过是data Set a = Set [a],这意味着使用Set构造函数构造值,就像你所做的那样这里在complR的右侧的定义将不能确保它返回一个真正的Set,这要求没有元素重复。这是否也在您的任务中为您定义?如果是这样,请包括Set的定义,因为没有它很难弄清楚有什么问题。 -
感谢您的评论!我不认为作业是使用 Data.Set。我不认为包括在内。我看到了数据列表。但是我确实看到了:newtype Set a = Set [a] deriving (Eq,Ord)。 inR 的类型是这样的:Ord a => Rel a -> (a,a) -> Bool (就像你说的那样)
-
@user3791741 bheklilr 是对的 - 到目前为止,您的所有相关代码都应该在您的问题中,包括从屏幕复制和粘贴的 exact 错误消息。
-
@user3791741 很好地提出了一个包含所有相关细节的问题。有一个赞成票和几个答案!