Haskell操作定义:无法推断(Eq a)因使用`=='而产生的从上下文(Num a)

时间:2015-03-08 19:53:47

标签: haskell

我需要定义一个操作(< - <),它返回一个< - < - < b如果b的实除数大于a的除数。我还需要使用声明:

(<-<) :: Num a => a -> a -> Bool

我尝试了以下表达式:

a <-< b = ((length [x | x<-[2..b-1], b `mod` x == 0]) > (length [x | x<-[1..a], a `mod` x == 0]))

它工作正常,但只有我不使用我给出的声明。有了这个,我得到了像

这样的常见错误
Could not deduce (Enum a) arising from the arithmetic sequence 2 .. b - 1 from the context (Num a)
Could not deduce (Integral a) arising from a use of mod from the context (Num a)
Could not deduce (Eq a) arising from a use of == from the context (Num a)

我知道我可以通过修改声明来消除错误,甚至完全删除它,但我的任务是用该声明编写表达式。怎么可能?

1 个答案:

答案 0 :(得分:1)

直到最近,Eq才是Num的超类。我打赌这项任务的日期可以追溯到这种情况。你应该让那个作业的人知道现代GHC中的签名已经不够了。

此外,如果Integral没有mod,该签名永远不会有效!

所以我敢打赌,这只是他们的疏忽。