无法推断实例(haskell错误)

匿名

我的作业中定义了以下内容:

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。我不认为这包括在内。我看到了Data.List。但是,我确实看到了这一点:newtype Set a =派生(Eq,Ord)的Set [a]。inR的类型是:Ord a => Rel a->(a,a)-> Bool。此分配中使用的文件是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)])
比克利尔

这里的问题是你怎么打电话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。您将获得更多翔实的错误消息以及更多功能。自2006年以来,Hugs就没有开发过,而GHC仍在积极开发中,并定期发布新版本。Hugs还存在一些错误,这些错误会不时出现,因为它已经有8年没有任何维护了,因此,最好使用Haskell平台,该平台包括GHC和许多流行的库,因此会更好

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章