【问题标题】:Why doesn't `putStrLn getLine` work?为什么 `putStrLn getLine` 不起作用?
【发布时间】:2011-03-07 06:15:38
【问题描述】:

我是 Haskell 的新手。 我的带有GHCi 的 Haskell 脚本,

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 的输入?

【问题讨论】:

    标签: haskell stdio


    【解决方案1】:
    putStrLn :: String -> IO ()
    getLine :: IO String
    

    类型不匹配。 getLine 是一个 IO 操作,putStrLn 采用纯字符串。

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

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

    【讨论】:

    • 你有一个值卡在 IO monad m a 中,并且有一个函数在 IO monad a -&gt; m b 中返回它的值。您希望以 IO 操作 m b 结束。这就是m a -&gt; (a -&gt; m b) -&gt; m bStop. Hoogle time. &gt;&gt;= 是首批结果之一。 :)
    • 不幸的是,我们需要的确切实例化没有结果:IO String -&gt; (String -&gt; IO ()) -&gt; IO ()
    • Eonil 更接近您的putStrLn getLine 的意图,使用反向绑定:putStrLn =&lt;&lt; getLine。这是fmap,后跟join,所以我们可以写成join (putStrLn &lt;$&gt; getLine)。我希望有比(=&lt;&lt;)更可爱的东西@
    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多