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
我的程序似乎不起作用!我的问题是为什么我无法指定avg
sum
函数的返回sum'
?
答案 0 :(得分:6)
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
i)average1
的类型签名不正确,该函数不返回值
ii)[编辑:这一点不正确]
iii)平均值是一个浮点数,因此你需要转换整数参数
iv)您的测试if (x/=[])
是错误的,应使用m
而不是x
v)您的大部分行都不在IO
monad中,因此应在let
块中使用do
答案 1 :(得分:5)
您无法使用<-
表示法来指定sum' m
和x/length m
的返回值。 <-
只能在右侧是monadic表达式(在本例中为IO
值)时使用,这两者都不是,因此您应该使用let x = sum' m
和{ {1}}而是需要let avg = x / fromInteger (length m)
才能将fromInteger
返回的Int
转换为小数值,以便将其传递给length m
)。 (另外,您需要将/
更改为x /= []
。)