Разница для ncurses между интерпретируемым и скомпилированным Haskell?

У меня странная проблема с функциями timeout а также getch из библиотеки ncurses, используемой в Haskell. Когда я использую их из GHCi или runhaskell, они работают как положено - getch ожидает количество миллисекунд, переданных timeout и затем возвращается, даже если не было введено никаких данных. Но когда я компилирую тот же файл, используя GHC, getch возвращается немедленно.

Я попробовал две привязки 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 некоторые тонкие настройки терминала? Или скомпилированный код загружает библиотеки другим способом?

ДОБАВЛЕНО:

Я попытался вызвать C-программу из скомпилированного Haskell, используя FFI, и она сразу же вернулась (что неверно). Я думаю, это означает, что проблема не в библиотеках, а где-то во время выполнения GHC.

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.

Другие вопросы по тегам