У меня странная проблема с функциями timeout
и getch
из библиотеки ncurses, используемой в Haskell. Когда я использую их из GHCi или runhaskell, они работают так, как ожидалось. getch
ждет число миллисекунд, выданных timeout
, а затем возвращается, даже если вход не был дан. Но когда я скомпилировать тот же файл, используя GHC, getch
немедленно возвращается.Разница для ncurses между интерпретированным и скомпилированным Haskell?
Я попробовал две привязки 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 и немедленно возвращается (что неверно). Я думаю, это означает, что проблема не в библиотеках, а где-то в среде исполнения GHC.
, если код, показанный выше, действительно ведет себя так, как описано при компиляции, вы должны отправить отчет об ошибке в поддержку библиотек. – didierc
Библиотеки Haskell должны делать то же самое, что и программа C, и они корректно работают при интерпретации, поэтому я не думаю, что проблема здесь. –
хорошо, он работает для меня либо из repl, либо с runhaskell. – didierc