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

Eon*_*nil 7 haskell stdio

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

Prelude> let a = putStrLn getLine
Run Code Online (Sandbox Code Playgroud)

发生这样的错误.

<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> 
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用,我如何打印输入的东西stdin

eph*_*ent 14

putStrLn :: String -> IO ()
getLine :: IO String
Run Code Online (Sandbox Code Playgroud)

类型不匹配. getLine是一个IO动作,并putStrLn采用一个普通的字符串.

您需要做的是绑定IOmonad中的行以将其传递给putStrLn.以下是等效的:

a = do line <- getLine
       putStrLn line

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

a = getLine >>= putStrLn
Run Code Online (Sandbox Code Playgroud)

  • 你在IO monad`ma`中有一个值,并且一个函数在IO monad`a - > mb`中返回它的值.你想最终得到一个IO动作`mb`.所有这些都是`ma - >(a - > mb) - > mb`.[停止.Hoogle时间.](http://haskell.org/hoogle/?hoogle=(a + - %3E + m + b)+ - %3E + m + a + - %3E + mb)`>> =`是其中之一第一个结果.:) (2认同)