无法推断实例(haskell错误)

时间:2014-06-30 20:52:27

标签: haskell set relation

我的任务中定义了以下内容:

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.hshttp://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)])

2 个答案:

答案 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 => bNum 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将所有类型加起来的实例,但它不能。