没有因使用' rem而导致的(Integral Double)实例。

时间:2016-04-28 01:35:20

标签: haskell

Haskell "No instance for" error

Haskell Error: "No instance for (Enum [Int])

Function definition problems (No instance for … arising from)

No instance for Num String arising from the literal `1'

我是Haskell的新手,以及一般的函数式编程。另外,我知道上面的问题非常相似,但我无法在任何地方找到解决问题的方法。以下代码用于查找数字输入的因子:

fc4 :: Double -> IO ()
check :: Double -> Double -> IO ()
fc4 a = check a (sqrt a)
check a b = if rem a b == 0 then print (b, div a b) else print () >> if b > 1 then check a (b-1) else putStrLn ("Done.")

我尝试从Double切换到Integer并返回每个可能的组合,但每个都失败并出现同样的错误:

No instance for (Integral Double) arising from a use of 'rem'

我还尝试在fromIntegral的参数上明确使用toIntegerrem,但我尝试过的任何组合都没有避免此问题。我还在文档中看到rem的类型为Integral a => a -> a -> a,因此似乎使用ab的相同类型始终有效,无论是DoubleInteger

我能做点什么吗?我犯了一些可怕的菜鸟错误吗?作为参考,here是我希望实现的C ++版本。提前谢谢!

1 个答案:

答案 0 :(得分:6)

您只需在类型签名中将Double替换为Integer,因为您需要使用其类型为Integral类型类的实例的值,该类定义{{1} }和div。但是,rem仅返回作为sqrt类型类实例的值,并且不存在任何类型的实例。

简单的解决方案是使用Floating获取略大于ceiling的整数值,这不会影响算法的正确性。

sqrt n