我的作业中定义了以下内容:
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.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)])
这里的问题是你怎么打电话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。您将获得更多翔实的错误消息以及更多功能。自2006年以来,Hugs就没有开发过,而GHC仍在积极开发中,并定期发布新版本。Hugs还存在一些错误,这些错误会不时出现,因为它已经有8年没有任何维护了,因此,最好使用Haskell平台,该平台包括GHC和许多流行的库,因此会更好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句