Tôi gặp sự cố lạ với các hàm timeout
và getch
từ thư viện ncurses được sử dụng trong Haskell. Khi tôi sử dụng chúng từ GHCi hoặc runhaskell, chúng hoạt động như mong đợi - getch
đợi số milisecond được cấp cho timeout
và sau đó trả về, ngay cả khi không có đầu vào nào được đưa ra. Nhưng khi tôi biên dịch cùng một tệp bằng GHC, getch
sẽ trả về ngay lập tức.Sự khác biệt cho ncurses giữa giải thích và biên dịch Haskell?
Tôi đã thử hai liên kết ncurses cho Haskell; hscurses
:
import UI.HSCurses.Curses
main = do
initCurses
timeout 1000
c <- getch
endWin
print c
và ncurses
:
import UI.NCurses
main = do
e <- runCurses $ do
win <- defaultWindow
getEvent win $ Just 1000
print e
Cả hai hành xử theo cách kỳ lạ tương tự được mô tả trước đó.
Tôi cũng đã cố gắng chương trình tương đương trong C:
#include <ncurses.h>
int main()
{
initscr();
wtimeout(stdscr,1000);
int c = getch();
endwin();
printf("%d\n", c);
return 0;
}
một này hoạt động như mong đợi.
Vì vậy, câu hỏi của tôi là: điều gì có thể tạo sự khác biệt khi sử dụng thiết bị đầu cuối từ diễn giải và từ Haskell đã biên dịch? Do runhaskell và ghci sửa đổi một số thiết lập đầu cuối tinh tế? Hoặc các mã biên dịch tải thư viện một cách khác nhau?
thêm:
tôi đã cố gắng để gọi một chương trình C từ biên soạn Haskell sử dụng FFI và nó trở lại ngay lập tức (đó là không chính xác). Tôi nghĩ điều đó có nghĩa là vấn đề không nằm trong thư viện, nhưng ở đâu đó trong thời gian chạy của GHC.
nếu mã được hiển thị ở trên thực sự hoạt động như mô tả khi được biên dịch, bạn nên gửi báo cáo lỗi cho người bảo trì thư viện. – didierc
Các thư viện Haskell nên làm điều cần thiết giống như chương trình C và chúng hoạt động chính xác khi được giải thích, vì vậy tôi không nghĩ rằng vấn đề là ở đây. –
tốt, nó hoạt động cho tôi hoặc từ repl hoặc với runhaskell. – didierc