module PRO where
average1 :: IO Float
avarage1 =
do
putStrLn "Enter Marks in Form of a List"
marks <- getLine
let m = (read marks)::[Int]
x<-(sum' (m))
avg <- x/length (m)
if(x/=[])
then
putStrLn ("empty List")
else
putStrLn ("Your Avarage is " ++ show(avg))
sum' :: (Num a) => [a] -> a
sum' xs = foldl (\acc x -> acc + x) 0 xs
Run Code Online (Sandbox Code Playgroud)
我的程序似乎不起作用!我的问题是,为什么我不能指定avg返回sum的的sum'功能?
module PRO where
average1 :: IO ()
average1 =
do
putStrLn "Enter Marks in Form of a List"
marks <- getLine
let m = (read marks)::[Int]
let x = sum' m
let avg = (fromIntegral x)/(fromIntegral $ length m)
if(m==[])
then
putStrLn ("empty List")
else
putStrLn ("Your Avarage is " ++ (show avg))
sum' :: (Num a) => [a] -> a
sum' xs = foldl (\acc x -> acc + x) 0 xs
Run Code Online (Sandbox Code Playgroud)
i)类型签名average1不正确,该函数不返回值
ii)[编辑:这一点不正确]
iii)平均值是一个浮点数,因此您需要转换整数参数
iv)您的测试if (x/=[])是南辕北辙,应使用m不x
v)你的大部分线都不在IOmonad中,所以应该let在一个do块里面使用
你不能使用<-符号分配的返回值sum' m和x/length m. <-只有当右侧是monadic表达式(在这种情况下是一个IO值)时才能使用,这两个都不是,所以你应该使用let x = sum' m而let avg = x / fromInteger (length m)不是(fromInteger需要将Int返回的length m值转换为Fractional值,以便它可以被传递给/).(另外,您需要更改x /= []为m /= [].)