我对Haskell中使用的ncurses库中的函数timeout
和getch
有一个奇怪的问题。当我从GHCi或runhaskell使用它们时,它们按预期工作 - getch
等待给予timeout
的毫秒数,然后返回,即使没有给出输入。但是当我使用GHC 编译同一个文件时,getch
会立即返回。
我为Haskell尝试了两个ncurses绑定; hscurses
:
import UI.HSCurses.Curses
main = do
initCurses
timeout 1000
c <- getch
endWin
print c
和ncurses
:
import UI.NCurses
main = do
e <- runCurses $ do
win <- defaultWindow
getEvent win $ Just 1000
print e
两者都表现出与之前描述的相同的奇怪方式。
我也在C:
尝试了相同的程序#include <ncurses.h>
int main()
{
initscr();
wtimeout(stdscr,1000);
int c = getch();
endwin();
printf("%d\n", c);
return 0;
}
这个按预期工作。
所以我的问题是:当使用解释后的终端和编译的Haskell时,有什么能够产生差异? runhaskell和ghci修改了一些微妙的终端设置吗?或者编译的代码是否以不同的方式加载库?
增加:
我尝试使用FFI从已编译的Haskell调用C程序,并立即返回(这是不正确的)。我认为这意味着问题不在库中,而是在GHC运行时的某个地方。
答案 0 :(得分:1)
我尝试使用runhaskell尝试使用较大超时值进行略微修改的代码,并使用以下命令执行ghc:
$ runhaskell so_15305317.hs
$ ghc -packages hscurses -lncurses so_15305317.hs
$ ./a.out
在这两种情况下,我都得到了预期的行为。你必须安装ghc 破坏,或用于编译的命令,包括破坏库行为的参数。
在debian 6.0.5系统上,ghc版本是6.12.1,hcurses是1.13.0.2。