Haskell IO函数接受来自另一个函数的返回值

时间:2011-06-12 02:58:00

标签: haskell input

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'

2 个答案:

答案 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' mx/length m的返回值。 <-只能在右侧是monadic表达式(在本例中为IO值)时使用,这两者都不是,因此您应该使用let x = sum' m和{ {1}}而是需要let avg = x / fromInteger (length m)才能将fromInteger返回的Int转换为小数值,以便将其传递给length m)。 (另外,您需要将/更改为x /= []。)