gpt4 book ai didi

Haskell 将 putStr 和 putStrLn 放在程序末尾而不是在执行期间

转载 作者:行者123 更新时间:2023-12-02 12:10:52 25 4
gpt4 key购买 nike

我有一个简单的程序,只需从用户处获取一个字符串和一个 key ,并使用凯撒密码函数对该字符串进行加密。该函数本身可以工作,所以我不会展示其来源。问题是,当编译器编译程序时,它将允许我输入所有 getLines,然后在输入所有内容后,程序将打印所有 putStr 和 putStrLn 然后关闭。仅当程序使用“runhaskell”执行或编译并作为 exe 执行时才会发生这种情况,即。不在解释器中。程序如下:

main = do

choice <- prompt "Would you like to encrypt (1) or decrypt (2)? "

if choice == "1" then do
encrypt <- prompt "Enter code for encryption: "
k <- prompt "Enter key for the code: "
let key = read k in
putStrLn ("Encrypted message: " ++ (caesar key encrypt) ++ "\n")

else do
decrypt <- prompt "Enter code for decryption: "
k <- prompt "Enter key for the code: "
let key = read k in
putStrLn ("Decrypted message: " ++ (caesar (-key) decrypt) ++ "\n")

getLine

prompt str = do
putStr str
getLine

在解释器中运行时的输出:

Prelude Main> main
Would you like to encrypt (1) or decrypt (2)? 1 <- the one is user input
Enter code for encryption: Hello world <- user input
Enter key for the code: 2 <- user input
Encrypted message: Jgnnq"yqtnf <- program output

编译后执行时的输出:

1           <- user has to input before the console is printed out
Hello world <--┘
2 <--┘
Would you like to encrypt (1) or decrypt (2)? Enter code for encryption: Enter key for the code: Encrypted message: Jgnnq"yqtnf

我忽略了 putStrLn 和 putStr 的某些内容吗?它们仅作为函数或其他内容的结果执行吗?

此外,我创建的“提示”函数不是问题,因为我用各自的 putStr 和 getLine 替换了所有提示的使用,但它仍然做了同样的事情。

最佳答案

runhaskellghci旨在尽快启动您的程序,而不强调运行程序的效率。因此,与 ghc 相比,他们做出了许多次优效率决策。 ,这里让您感到困扰的是它们默认情况下不对标准输入或输出使用缓冲,而 ghc默认情况下使用更有效的行缓冲。因为您从未在 prompt 期间打印结束行s,在编译版本中,缓冲区不会向用户显示...直到到达 putStrLn在程序末尾打印行结束符,并立即显示整个缓冲区。

你有一些选择:

  1. 明确要求不要缓冲。这将使您编译的程序稍微慢一些(在人类交互速度下不太可能被注意到),但行为更像解释版本。进口System.IO并使用hSetBuffering stdout NoBuffering main开头.
  2. 当您知道要暂停以等待用户输入时,显式刷新缓冲区。进口System.IO并使用hFlush stdout每次调用 getLine 之前.
  3. 以两种缓冲模式之间行为相同的方式进行输出。使用putStrLn而不是putStr无处不在。

关于Haskell 将 putStr 和 putStrLn 放在程序末尾而不是在执行期间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56993991/

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