gpt4 book ai didi

haskell - 使用 IO.readLn 从 Haskell 中的标准输入读取单行

转载 作者:行者123 更新时间:2023-12-03 15:06:39 27 4
gpt4 key购买 nike

此代码无法在 GHC 7.0.3 中编译:

import System.IO

main = do
z <- readLn
print z

我的意图是从标准输入读取一行并将其存储在 z 中,以便以后用它做更高级的事情。错误消息如下所示:
test.hs:5:9:
Ambiguous type variable `a0' in the constraints:
(Show a0) arising from a use of `print' at test.hs:5:9-13
(Read a0) arising from a use of `readLn' at test.hs:4:14-19
Probable fix: add a type signature that fixes these type variable(s)
In a stmt of a 'do' expression: print z
In the expression:
do { z <- readLn;
print z;
return () }
In an equation for `main':
main
= do { z <- readLn;
print z;
return () }

显然,我还没有理解一些基本的东西;请向我解释为什么它不起作用以及如何解决它。

编辑1 : 我通过更改 print z 修复了编译错误至 putStrLn z ,所以 GHC 知道我想读取一个字符串。但是当我运行程序时,我得到一个我无法理解的运行时错误:
$ ./test
hello!
test: user error (Prelude.readIO: no parse)
$

我只是输入“你好!”然后进入。请注意,我在 OS X 上运行 x86_64 GHC,这被认为是不稳定的。

编辑2 :我将 readLn 更改为 getLine,它无缘无故地神奇地工作。我想知道为什么,但我很高兴它有效。

最终代码:
import System.IO

main = do
z <- getLine
print z

最佳答案

readLn 作为类型:Read a => IO a .它从用户那里读取一行,然后将字符串解析为类型 a .什么是类型a ?它是你想要的任何东西(只要它是 Read 的一个实例)。例如:

readAInt :: IO Int
readAInt = readLn

readABool :: IO Bool
readABool = readLn
print类型为 Show a => a -> IO () .它的类型是 Show 的实例, 并打印出来。例如,打印 True , 你可以使用 print True .要打印 Int 42,您可以使用 print 42 .

在您的示例中,您同时使用 print 和 readLn 。这不起作用,因为 haskell 无法确定 readLn 的类型应该返回。 print可以采用任何可显示的类型,因此它不限于一种将返回的类型。这使得返回类型为 readLn模棱两可,因为 haskell 无法确定类型。这就是错误消息所说的。

您可能只存储用户输入的字符串,而不是将其读入您自己的类型。您可以使用类型为 getLine :: IO String 的 getLine 执行此操作。 .同样,您可以使用 putStrLn而不是 print只打印一个字符串。 putStrLn类型为 String -> IO () .

关于haskell - 使用 IO.readLn 从 Haskell 中的标准输入读取单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7801407/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com