10

timeout我对函数和getchHaskell 中使用的 ncurses 库有一个奇怪的问题。当我从 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 运行时的某个地方。

4

1 回答 1

1

我使用 runhaskell 和 ghc 使用以下命令尝试了您的代码 - 稍微修改了更大的超时值:

$ runhaskell so_15305317.hs

$ ghc -packages hscurses -lncurses so_15305317.hs
$ ./a.out

在这两种情况下,我都得到了预期的行为。您的 ghc 安装必须被破坏,或者用于编译的命令包括破坏库行为的参数。

ghc 版本是 6.12.1,hcurses 是 1.13.0.2,在 debian 6.0.5 系统上。

于 2013-03-09T16:00:57.443 回答