我的任务中定义了以下内容:
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))]
可以像这样调用集合类型:(设置[(1,2)])。 当我尝试这样调用函数时,我收到一个''无法推断实例''错误。我很确定这是因为我的电话而且是因为Rel a具体。 inR也在我未包含的作业中定义。
我做错了什么?我这样称之为:
complR (Set [(5,4), (3,3)]) (Set [(1,3)])
谢谢!
修改 我认为该作业不使用Data.Set。我没有看到包括在内。我看到Data.List。我确实看到有这样的:newtype设置a =设置[a]导出(Eq,Ord)。 inR的类型是:Ord a =&gt; Rel a - &gt; (a,a) - &gt;布尔。 此作业中使用的文件是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)])
答案 0 :(得分:4)
这里的问题是你如何调用complR
。您的定义可能不是您想要的。仔细检查complR
的类型:
complR :: Ord a => Set a -> Rel a -> Rel a
让我们用Rel a = Set (a, a)
:
complR :: Ord a => Set a -> Set (a, a) -> Set (a, a)
现在,看看你如何称呼它:
complR (Set [(4, 5), (3, 3)]) (Set [(1, 3)])
您说第一个参数的类型为Num b => Set (b, b)
,这意味着a ~ Num b =>(b, b)
,这意味着第二个参数的类型必须为Num b => Set ((b, b), (b, b))
。由于您为此参数输入了Set [(1, 3)]
,因此会尝试统一Num b => b
和Num b => (b, b)
类型,这会导致您在上面看到的错误。
你如何解决这个问题?您可以选择更改complR
的定义,使其具有类型
complR :: Ord a => Rel a -> Rel a -> Rel a
或者修正你如何将其称为
complR (Set [3, 4, 5]) (Set [(1, 3)])
我不会告诉你在这种情况下哪个是正确的,你必须自己确定。
解决此类错误的方法是在代码中添加一些显式类型注释:
complR (Set [(5, 4), (3, 3)] :: Set (Int, Int)) (Set [(1, 3)] :: Rel Int)
会抛出错误(在GHC中)
Couldn't match type `Int' with `(Int, Int)'
Expected type: Rel (Int, Int)
Actual type: Rel Int
In the second argument of `complR', namely
`(Set [(1, 3)] :: Rel Int)'
In the expression:
complR
(Set [(5, 4), (3, 3)] :: Set (Int, Int)) (Set [(1, 3)] :: Rel Int)
In an equation for `it':
it
= complR
(Set [(5, 4), (3, 3)] :: Set (Int, Int)) (Set [(1, 3)] :: Rel Int)
更明确地说“无法将类型Int
与(Int, Int)
匹配”,这更清楚地表明问题是什么,您尝试在需要的地方使用元组单号。它甚至说“预期类型:Rel(Int,Int)......在complR
”的第二个参数中,它告诉你某事情已经结束。
作为旁注,我强烈建议放弃拥抱,转而支持GHC。您将获得更多信息性错误消息,以及更多功能。 Hugs自2006年以来一直没有发展,而GHC仍在积极开发并定期发布新版本。拥抱也有一些不时出现的错误,因为它在8年内没有任何维护,所以你会更好地抓住Haskell Platform,其中包括GHC和许多流行的库。
答案 1 :(得分:2)
您有type Rel a = Set (a,a)
,complR
的类型签名是
complR :: Ord a => Set a -> Rel a -> Rel a
所以我们应该给它一组a
,一组a
对,它会给我们一组新的对。
你试过
complR (Set [(5,4), (3,3)]) (Set [(4,5)])
这实际上是一种类型不匹配,因为两者都是关系,其中第一个应该只是一个集合,但编译器善于(!)试图消失并弄清楚你是否可以做出一些奇怪的Num
将所有类型加起来的实例,但它不能。