Haskellで使用されている関数timeout
とncursesライブラリに奇妙な問題があります。getch
GHCiまたはrunhaskellからそれらを使用すると、期待どおりに機能します。入力が与えられていなくても、getch
与えられたミリ秒数を待ってからtimeout
戻ります。しかし、GHCを使用して同じファイルをコンパイルgetch
すると、すぐに戻ります。
Haskell用に2つの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のランタイムのどこかにあることを意味していると思います。