我有这个功能:
onData :: IO ([Float]) -> IO ()
onData vals =
do
let res = liftM fsum vals
putStrLn " * Processing ... "
putStrLn res
putStrLn " * Sum : "
putStrLn " * Done Processing"
return ()
fsum :: [Float] -> Float
fsum [] = 0
fsum (x:xs) = x + fsum(xs)
这个函数,我在'fsum'调用时遇到错误。我错过了什么?我只想要返回的值。
HaskellParseData.hs:20:14:
Couldn't match expected type `[Char]' with actual type `IO Float'
Expected type: String
Actual type: IO Float
In the first argument of `putStrLn', namely `res'
In a stmt of a 'do' expression: putStrLn res
答案 0 :(得分:2)
liftM fsum vals
的类型为IO Float
。您使用let res = ...
为其命名,但稍后尝试将其用作Float
。您应该绑定,使用Float
根据需要生成<-
:
res <- liftM fsum vals
onData
代替[Float]
更为惯用;您可以对在其他地方生成此数据的操作进行排序。然后你可以简单地使用:
let res = fsum vals
答案 1 :(得分:1)
GHC从putStrLn
推断res
必须是String
。
将putStrLn res
更改为putStrLn $ show res
。
(ehird说的也是如此。)