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

Vis*_*tne 1 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
Run Code Online (Sandbox Code Playgroud)

我的程序似乎不起作用!我的问题是,为什么我不能指定avg返回sum的的sum'功能?

viv*_*ian 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
Run Code Online (Sandbox Code Playgroud)

i)类型签名average1不正确,该函数不返回值

ii)[编辑:这一点不正确]

iii)平均值是一个浮点数,因此您需要转换整数参数

iv)您的测试if (x/=[])是南辕北辙,应使用mx

v)你的大部分线都不在IOmonad中,所以应该let在一个do块里面使用


jwo*_*der 5

你不能使用<-符号分配的返回值sum' mx/length m. <-只有当右侧是monadic表达式(在这种情况下是一个IO值)时才能使用,这两个都不是,所以你应该使用let x = sum' mlet avg = x / fromInteger (length m)不是(fromInteger需要将Int返回的length m值转换为Fractional值,以便它可以被传递给/).(另外,您需要更改x /= []m /= [].)