gpt4 book ai didi

haskell - GHCi 与 runhaskell 的 getLine 功能差异

转载 作者:行者123 更新时间:2023-12-03 13:30:00 27 4
gpt4 key购买 nike

我刚刚偶然发现了一个我不明白的东西。

如果我使用 GHCi 并使用 getLine我得到以下

Prelude> a <- getLine
Test<Backspace>oo<CR> -- the Backspace action results in a '^?'
Prelude> a
"Test\DELoo"

如果我写 相同在 Haskell 文件中
module Main where

main :: IO ()
main = do a <- getLine
putStrLn a

并使用 runhaskell 运行脚本并输入相同的输入,退格键会按预期删除“t”。

为什么有区别?

最佳答案

这是由于 GHCi 和 GHC 中不同的缓冲行为。 GHCi 具有使用 NoBuffering 的标准输入(标准输入流)默认情况下,GHC 编译的二进制文件/runhaskell使用 LineBuffering默认。如果你明确地这样做

hSetBuffering stdin NoBuffering

在您的 Haskell 程序中,您将能够重现 GHCi 行为。如果你这样做
hSetBuffering stdin LineBuffering

在 GHCi 中,您会有很多不需要的副作用,但可以重现 runhaskell行为。

关于haskell - GHCi 与 runhaskell 的 getLine 功能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21114222/

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