我有一个奇怪的问题,功能timeout
和getch
来自Haskell中使用的ncurses库。当我从GHCi或runhaskell使用它们时,它们按预期工作 - getch
等待给予timeout
的毫秒数,然后返回,即使没有给出输入。但是当我编译使用GHC的同一个文件,getch
立即返回。解释和编译Haskell之间的ncurses的区别?
我尝试了两个ncurses绑定Haskell; 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是否修改了一些微妙的终端设置?或者编译的代码加载库的方式不同?
新增:
席力图召从编译使用Haskell的FFI一个C程序,并立即返回(这是不正确的)。我认为这意味着问题不在图书馆,而是在GHC运行时的某个地方。
如果上面显示的代码的行为与编译时描述的行为相同,则应该向库维护人员提交错误报告。 – didierc 2013-03-09 08:16:23
Haskell库应该和C程序一样重要,它们在解释时可以正确工作,所以我不认为问题在这里。 – 2013-03-09 14:20:38
好吧,它适用于我从repl或runhaskell。 – didierc 2013-03-09 15:06:21