Haskell IO函数接受来自另一个函数的返回值
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
?Haskell IO函数接受来自另一个函数的返回值
不能使用<-
表示法来分配返回值sum' m
和x/length m
。当右手侧是一元表达式(在这种情况下,IO
值),其没有一个是<-
只能被使用,并且因此应使用let x = sum' m
和let avg = x/fromInteger (length m)
代替(fromInteger
需要为转换由length m
返回的Int
到分数值,因此可以传递给/
)。 (而且,你可能需要改变x /= []
到m /= []
)
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
单子,因此应该使用let
一个do
块
MacPhail非常感谢您的帮助。代码编译没有问题,但我仍然得到一个运行时错误说 'PRO> average1' '在List' '[1,2,3]'' 你Avarage is' '计划的形式输入标志错误:Prelude.read:没有解析' – 2011-06-12 03:27:59
@jwodder @Vivian McPhail明白了,谢谢你们提供的帮助。你摇滚! – 2011-06-12 03:39:14
感谢名单jwodder里面!但我仍然不能让计算平均我得到错误 错误文件:。\ PRO.hs:10 - 在应用程序中的类型错误 ***表达式:fromInteger(长度米) ***期限:长度m * **类型:Int ***不匹配:整数 – 2011-06-12 03:16:52
@visuddha使用'fromIntegral'来强制整型。 – 2011-06-12 04:10:58