Haskell与IO monad错误,从IO到基本类型

时间:2012-02-06 22:17:20

标签: haskell

我有这个功能:

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

2 个答案:

答案 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说的也是如此。)