为什么`putStrLn getLine`不起作用?

时间:2011-03-07 06:15:39

标签: haskell stdio

我在Haskell上完成了新手。 我的Haskell脚本GHCi

Prelude> let a = putStrLn getLine

发生这样的错误。

<interactive>:1:17:
    Couldn't match expected type `String'
           against inferred type `IO String'
    In the first argument of `putStrLn', namely `getLine'
    In the expression: putStrLn getLine
    In the definition of `a': a = putStrLn getLine
Prelude> 

为什么不起作用,如何从stdin打印输入内容?

1 个答案:

答案 0 :(得分:14)

putStrLn :: String -> IO ()
getLine :: IO String

类型不匹配。 getLineIO操作,putStrLn采用纯字符串。

您需要做的是绑定IO monad中的行,以便将其传递给putStrLn。以下是等效的:

a = do line <- getLine
       putStrLn line

a = getLine >>= \line -> putStrLn line

a = getLine >>= putStrLn