繁体   English   中英

解释和编译的Haskell之间的ncurses的区别?

[英]Difference for ncurses between interpreted and compiled Haskell?

我有一个奇怪的问题,功能timeout和来自Haskell中使用的ncurses库的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运行时的某个地方。

我尝试了你的代码 - 使用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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM