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

Jan*_*ček 10 haskell ncurses ghc ghci runhaskell

函数timeoutgetchHaskell中使用的ncurses库有一个奇怪的问题.当我从GHCi或runhaskell使用它们时,它们按预期工作 - getch等待给定的毫秒数timeout然后返回,即使没有给出输入.但是当我使用GHC 编译同一个文件时,getch立即返回.

我为Haskell尝试了两个ncurses绑定; hscurses:

import UI.HSCurses.Curses

main = do
  initCurses
  timeout 1000
  c <- getch
  endWin
  print c
Run Code Online (Sandbox Code Playgroud)

并且ncurses:

import UI.NCurses

main = do
  e <- runCurses $ do
    win <- defaultWindow
    getEvent win $ Just 1000
  print e
Run Code Online (Sandbox Code Playgroud)

两者都表现出与之前描述的相同的奇怪方式.

我也试过C中的等价程序:

#include <ncurses.h>

int main()
{
  initscr();
  wtimeout(stdscr,1000);
  int c = getch();
  endwin();
  printf("%d\n", c);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个按预期工作.

所以我的问题是:当使用解释后的终端和编译的Haskell时,有什么能够产生差异?runhaskell和ghci修改了一些微妙的终端设置吗?或者编译后的代码是否以不同的方式加载库?

添加:

我试图使用FFI从编译的Haskell调用C程序,它立即返回(这是不正确的).我认为这意味着问题不在库中,而是在GHC运行时的某个地方.

did*_*erc 1

我尝试了你的代码 - 使用 runhaskell 和 ghc 以及以下命令进行了稍微修改,设置了更大的超时值:

$ runhaskell so_15305317.hs

$ ghc -packages hscurses -lncurses so_15305317.hs
$ ./a.out
Run Code Online (Sandbox Code Playgroud)

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

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

  • @honzasp“我尝试使用 FFI 从已编译的 Haskell 调用 C 程序,它立即返回(这是不正确的)。” 这是预期的行为(至少现在是这样)。它在 7.2 到 7.4 步骤发生了变化。参见 http://hackage.haskell.org/trac/ghc/ticket/7745 (2认同)