Tôi đã xây dựng một vòng lặp đọc-in-in thực sự đơn giản trong Haskell để bắt Control-C (UserInterrupt). Tuy nhiên, bất cứ khi nào tôi biên dịch và chạy chương trình này, nó luôn luôn bắt đầu Control-C đầu tiên và luôn luôn hủy bỏ trên Control-C thứ hai với mã thoát 130. Không quan trọng bao nhiêu dòng đầu vào tôi đưa ra trước và giữa hai Control-Cs, nó luôn luôn xảy ra theo cách này. Tôi biết tôi phải thiếu một cái gì đó đơn giản ... xin vui lòng giúp đỡ, cảm ơn!Bắt ngoại lệ Control-C trong GHC (Haskell)
Lưu ý: đây là trường hợp ngoại lệ cơ bản-4, vì vậy Control.Exception chứ không phải Control.OldException.
import Control.Exception as E
import System.IO
main :: IO()
main = do hSetBuffering stdout NoBuffering
hSetBuffering stdin NoBuffering
repLoop
repLoop :: IO()
repLoop
= do putStr "> "
line <- interruptible "<interrupted>" getLine
if line == "exit"
then putStrLn "goodbye"
else do putStrLn $ "input was: " ++ line
repLoop
interruptible :: a -> IO a -> IO a
interruptible a m
= E.handleJust f return m
where
f UserInterrupt
= Just a
f _
= Nothing
Mã này sẽ không biên dịch với GHC 6.8, nhập 'Control.Exception' và' IO'. –
@Norman, GHC 6.12 * là * out. Nó không được bao gồm trong Nền tảng Haskell, nhưng nó đã có sẵn cho Arch và Debian không ổn định. –
Tại sao không cài đặt trình xử lý tín hiệu của riêng bạn? http://therning.org/magnus/archives/285 –