2011-06-12 91 views
0
--Standered Diviation 
module SD where 
diviation:: IO() 
diviation = 
    do 
     putStrLn ("Enter Students Marks") 
     marks <- getLine 
     let m = (read marks)::[Float] 
     let x = sum' m 
     let mean = (fromIntegral x)/(fromIntegral $ length) 
     let len = (read (length(m)))::Float 
     let divia = divi mean l 
     let std = map (^2) divia 
     let stdd = xx length(m-1) m 
     let final = map sqrt stdd 
     let tot = sum final 

     if(m==[]) 
       then 
       putStrLn("empty List" ++ show(tot)) 
      else do 
       putStrLn("The Standered Divation is" ++ (show(tot))) 


sum' :: (Num a) => [a] -> a 
sum' = foldl (+) 0 

avg::Float->Float->Float 
avg a b = (fromIntegral a)/(fromIntegral b) 

divi::Float->[Float]->[Float] 
divi a xs = [x-a | x <- xs] 

xx::Float->[Float]->[Float] 
xx a xs = [x/a|x<-xs] 

我找不出这个程序有什么问题。是这样表示haskell程序问题(类型错误)

ERROR file:.\SD.hs:11 - Type error in application 
*** Expression  : read (length m) 
*** Term   : length m 
*** Type   : Int 

错误你们可以请点我出的问题在这个方案,谢谢 *不匹配:[字符]

+4

你不能在'Int'上调用'read',这是'length'返回的结果。 'read'用于字符串。 – 2011-06-12 17:18:15

+0

你也没有真正使用这个值'len'。所以只要删除行'let len =(read(length(m)):: Float' – 2011-06-13 19:08:32

回答

0

功能读取具有类型字符串 - > '一个 ;你的错误告诉你长度为m的类型为Int,而read等待一个String。您可能想使用Data.List中的genericLength:

let len = Data.List.genericLength m :: Float 
1

您的代码中有几件事情您可能需要查看。你有:

let stdd = xx length(m-1) m 

这将不会typecheck。我想你的意思是:

let stdd = xx (length m-1) m 

(编辑:实际上,将不检查或者是由于对XX类型签名(为什么不)?)这条线:

let mean = (fromIntegral x)/(fromIntegral $ length) 

Num除以函数

在这一行:`

let std = map (^2) divia 

是什么divia类型,什么是(^2)类型?

最后,在空列表甚至单例列表的情况下实际发生了什么?

另一方面,您可能想要考虑程序的哪些部分真的需要在main之内生存。既然这样,你

  • 打印线
  • 读取输入
  • 计算标准偏差
  • 打印的计算结果

为什么不分解出一个standardDev功能?这可能会使您的main功能更短,更清晰。编写纯函数还允许您更方便地在REPL中测试函数。当我编写代码时,我发现构建简短的,明显正确的函数非常有用,可以将它们组合起来以获得所需的行为,并且只在最后时刻将结果转储到IO monad中。