gpt4 book ai didi

loops - 为交互式 IO : problems with do-notation and layout 编写循环

转载 作者:行者123 更新时间:2023-12-04 00:36:30 25 4
gpt4 key购买 nike

我刚开始使用 Haskell,它完全让我感到困惑。我之前做过 Java 和 Python,这对我来说更有意义。

我目前正在尝试获取用户输入,检查它是否有效,如果不是:打印错误并再次获取输入;如果有效:从中产生一个 bool 值。

更准确地说,我想要一个是/否输入,其中“y”将产生 True,“n”将产生 False,任何其他输入都会在命令行中打印一条消息并要求再次输入 y/n。

例如。:

Continue? y/n:
> assd
Invalid input.
Continue? y/n:
> y
(something happens)
Continue? y/n:
> n
(Close program)

用farmiliar格式编写它,这样的函数:
boolean inputBool() {
while(True) {
str = input("Continue? y/n: ");
if (str == "y") {
return True;
} else if (str == "n") {
return False;
} else {
print("Invalid input");
}
}

--main program--

while(inputBool()) {
doSomething();
}

因为我刚开始使用haskell(实际上是今天),所以我不太清楚我能做什么或不能做什么。
我在想类似的东西:
yesno :: Bool
yesno = do
putStr "Continue? y/n: "
str <- readLn
if (str == "y") then True else (
if (str == "n") then False else (
do
putStrLn "Invalid input."
yesno
)
)

由于许多原因,这不起作用。我的主要问题是我不知道这个“做什么”是做什么的。我刚刚读到它在需要 io 操作时使用并以某种方式执行以下表达式。在haskell中阅读完所有内容都会评估为一个值后,这对我来说没有意义。 “做什么”评价什么?
另外,预计会有什么缩进?这似乎是一种随机。
我知道该函数必须评估为我的 bool 值,使用此“do”操作似乎不可能。但是,如何将某些内容打印到控制台并仍然使其成为计算结果为 True 或 False 的表达式的一部分?

谢谢你的帮助。

(顺便说一句。互联网上有任何活跃的haskell论坛吗?我找不到任何=/)

最佳答案

由于您的函数需要执行 IO,因此它必须返回 IO 中的值。 monad,所以它的类型需要是 yesno :: IO Bool ,以及 TrueFalse值需要通过 return 提升到 monad 中.您还需要getLine而不是 readLn ,因为您想要一个原始字符串,而不是解析值(这可能会导致解析错误)。最后,您需要hFlush stdout在调用 getLine 之前,否则提示符仍将位于缓冲区中等待换行符(这需要您导入 System.IO)。

我已经将提示字符串变成了一个参数,因此您可以使用该函数来询问各种是/否问题:

import System.IO

yesno :: String -> IO Bool
yesno prompt = do
putStr $ prompt ++ " y/n: "
hFlush stdout
str <- getLine
case str of
"y" -> return True
"n" -> return False
_ -> do
putStrLn "Invalid input."
yesno prompt

然后,您可以从交互循环中调用您的函数:
main :: IO ()
main = do
fun <- yesno "Is Haskell fun?"
if fun
then putStrLn "rock on"
else putStrLn "read more tutorials"
continue <- yesno "Continue?"
if continue then main else return ()

关于loops - 为交互式 IO : problems with do-notation and layout 编写循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5695649/

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