haskell程序问题(类型错误)

时间:2011-06-12 17:15:41

标签: haskell

--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]

我无法弄清楚这个程序有什么问题。显示如下错误

ERROR file:.\SD.hs:11 - Type error in application
*** Expression     : read (length m)
*** Term           : length m
*** Type           : Int
你们可以在这个节目中指出我的问题,谢谢 * 不匹配:[Char]

2 个答案:

答案 0 :(得分:1)

您可能需要查看代码中的一些内容。你有:

let stdd = xx length(m-1) m

哪个不会出现问题。我想你的意思是:

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中。

答案 1 :(得分:0)

read函数的类型为String - &gt; '一个 ;您的错误告诉您长度m的类型为Int,而read则等待String。您可能希望使用Data.List中的genericLength:

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