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