我需要定义一个操作(< - <),它返回一个< - < - < 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)
我知道我可以通过修改声明来消除错误,甚至完全删除它,但我的任务是用该声明编写表达式。怎么可能?
答案 0 :(得分:1)
直到最近,Eq
才是Num
的超类。我打赌这项任务的日期可以追溯到这种情况。你应该让那个作业的人知道现代GHC中的签名已经不够了。
此外,如果Integral
没有mod
,该签名永远不会有效!
所以我敢打赌,这只是他们的疏忽。