我的代码,其中n = 4:
f n = map (4/) [1..n]
main = do
n <- getLine
print(f (product(map read $ words n :: [Int])))
如果我在终端map (4/) [1..n]
中使用,我会得到一个正确答案:[4.0,2.0,1.3333333333333333,1.0]
。
但是在我的程序中,它无法正常工作,错误信息是:No instance for (Fractional Int) arising from a use of
f&#39;`
我的错误在哪里?
答案 0 :(得分:3)
您的n
是Int
,不是Fractional
类型。这些是使用/
运算符支持除法的那些。您可以将/
替换为div
以获得整数除法(截断为整数),也可以添加fromIntegral
以将n
转换为正确的类型。
您的代码应该类似于
f n = map (4/) [1..fromIntegral n]
为了澄清一点:你的函数f最终会对给定的参数进行除法。这导致类型推断引擎确定那些参数应该是Fractional
类型。然后,您在main
中使用该功能,明确地给它Int
。
这就是为什么错误上写着“你给了我一个Int
。Fractional Int
没有实例(读作”Int
不是Fractional
类型')我需要它,因为你将Int
传递给需要该实例的东西。“