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

发布于 2024-10-21 03:37:19 字数 506 浏览 4 评论 0原文

我是 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输入的内容?

I'm complete newbie on Haskell.
My Haskell script with GHCi,

Prelude> let a = putStrLn getLine

makes an error like this.

<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> 

Why doesn't it work and how can I print something input from stdin?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

沉溺在你眼里的海 2024-10-28 03:37:19
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
putStrLn :: String -> IO ()
getLine :: IO String

The types do not match. getLine is an IO action, and putStrLn takes a plain string.

What you need to do is bind the line inside the IO monad in order to pass it to putStrLn. The following are equivalent:

a = do line <- getLine
       putStrLn line

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

a = getLine >>= putStrLn
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文