10

Haskellで使用されている関数timeoutとncursesライブラリに奇妙な問題があります。getchGHCiまたは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のランタイムのどこかにあることを意味していると思います。

4

1 に答える 1

1

次のコマンドでrunhaskellとghcを使用して、コードを試しました-タイムアウト値を大きくしてわずかに変更しました:

$ runhaskell so_15305317.hs

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

どちらの場合も、期待どおりの動作になりました。ghc のインストールが壊れているか、ライブラリの動作を壊すパラメータを含むコンパイルに使用されるコマンドが必要です。

debian 6.0.5 システムでは、ghc のバージョンは 6.12.1、hcurses は 1.13.0.2 です。

于 2013-03-09T16:00:57.443 に答える