gpt4 book ai didi

haskell - 如何在 Haskell 中无限读取和处理用户输入

转载 作者:行者123 更新时间:2023-12-03 14:56:22 24 4
gpt4 key购买 nike

我希望我的命令行 Haskell 程序能够像这样运行:
程序等待用户输入,

  • 用户输入内容,按“输入”
  • Haskell 处理输入,在标准输出
  • 上显示结果
  • Haskell 等待下一个用户输入
  • 如果没有更多输入,用户通过 Ctrl+D
  • 终止程序

    我试过getContents。但是 getContents 在处理它们之前等待用户输入所有行。

    最佳答案

    这里有很多困惑。让我们试着把事情弄清楚。

    I tried getContents. But getContents wait for user to type all lines before processing them.



    这里最有可能的是你已经编译了你的程序,并且没有注意到输出的默认缓冲是 block 缓冲。这很容易解决:
    f line = putStrLn ("Hi, " ++ line ++ "!")

    main = do
    hSetBuffering stdout LineBuffering -- or use NoBuffering
    putStrLn "Enter some names."
    input <- getContents
    mapM_ f (lines input)

    您应该使用 NoBuffering如果您不打算在每行用户输入之后打印整行(包括换行符)。

    要获得更准确的答案,我们需要查看您尝试过的无效代码。

    Q: But in my first try, I use: "interact show" and it doesn't work. Do you know why?
    A: Because show will not return any output until its entire input has been exhausted.



    这个答案并不完全正确。真正的答案是 show生成一个没有换行符的字符串! (虽然字符序列 ['\\','\n'] 有时会在输入超过一行时出现。)所以,对于 interact show , 你真的必须使用 NoBufferingstdout .例如,如果你使用这个:
    main = do
    hSetBuffering stdout NoBuffering
    interact show

    ...程序将在每一行之后打印更多输出。您可能还想设置 stdin的缓冲到 NoBuffering (而不是默认的 LineBuffering ),因为 show足够高效,以至于在每次击键后它确实可以产生更多的输出。

    关于haskell - 如何在 Haskell 中无限读取和处理用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10195215/

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