windows - 具有 NoBuffering 的 Haskell 跨平台 getChar

标签 windows haskell io ghc

Haskell 有 a bug in Windows好像fixed with WinIO in GHC9 : getChar 忽略 NoBuffering 模式 - 在按下 Enter 之前它不会计算。

有人 suggested通过外国电话的解决方法:

{-# LANGUAGE ForeignFunctionInterface #-}
import Data.Char
import Foreign.C.Types
getHiddenChar = fmap (chr.fromEnum) c_getch
foreign import ccall unsafe "conio.h getch"
  c_getch :: IO CInt

它有点工作,但问题是它似乎会阻止输出到控制台,直到按下某个键,而我同时读取按键并从不同的线程写入控制台。

请你帮忙找到一种方法(例如,写一个外部函数调用——不幸的是,我不太了解它)从控制台读取字符/键,没有缓冲和回显,也没有阻止输出到控制台,在 GHC 中8.8.x(或至少 8.10.x),在 Windows 上?

谢谢!

(理想情况下我需要一种跨平台的方式,但我可以通过条件编译来实现,所以如果它只能在 Windows 上工作就可以了。上面的外国调用还不是跨平台的)。

最佳答案

我找到了执行此操作的库:https://hackage.haskell.org/package/terminal

它不会在等待按键时阻塞,您仍然可以从另一个线程打印。

它还解决了 Windows 终端 utf8 problem .

关于windows - 具有 NoBuffering 的 Haskell 跨平台 getChar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66536563/

相关文章:

haskell - 成员函数对于 float 无法正常工作

haskell - "Unexpected end of input - expecting end of input"(秒差距)

java - 无法从 Java 文本文件中读取信息并对其进行排序

linux - 任何通过 SSH 工作的 git repo 查看器?

windows - 如果我已经安装了 Microsoft VC++ 2017 运行时,是否还需要安装 Microsoft VC++ 2015 运行时可再发行组件?

haskell - 使用 gi-gtk 和 Reactive Banana 捕获 Haskell 异常

java - 如何让编译器禁止对上限引用进行方法调用

c++ - 为什么我会收到这个超出范围的错误

java - Windows 上的 UTF-8/ISO-8859-1 编码问题 --> Unix

c++ - 阻止 alt+shift 事件或禁止以编程方式更改语言