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 

我的程序似乎不工作!我的问题是为什么我不能分配avgsum'函数的返回sumHaskell IO函数接受来自另一个函数的返回值

不能使用<-表示法来分配返回值sum' mx/length m。当右手侧是一元表达式(在这种情况下,IO值),其没有一个是<-只能被使用,并且因此应使用let x = sum' mlet avg = x/fromInteger (length m)代替(fromInteger需要为转换由length m返回的Int到分数值,因此可以传递给/)。 (而且,你可能需要改变x /= []m /= []

+0

感谢名单jwodder里面!但我仍然不能让计算平均我得到错误 错误文件:。\ PRO.hs:10 - 在应用程序中的类型错误 ***表达式:fromInteger(长度米) ***期限:长度m * **类型:Int ***不匹配:整数 – 2011-06-12 03:16:52

+1

@visuddha使用'fromIntegral'来强制整型。 – 2011-06-12 04:10:58

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

+0

MacPhail非常感谢您的帮助。代码编译没有问题,但我仍然得到一个运行时错误说 'PRO> average1' '在List' '[1,2,3]'' 你Avarage is' '计划的形式输入标志错误:Prelude.read:没有解析' – 2011-06-12 03:27:59

+0

@jwodder @Vivian McPhail明白了,谢谢你们提供的帮助。你摇滚! – 2011-06-12 03:39:14