J'ai construit une boucle d'écriture-lecture-écriture très simple dans Haskell qui capture Control-C (UserInterrupt). Cependant, chaque fois que je compile et exécute ce programme, il attrape toujours le premier Control-C et abandonne toujours le second Control-C avec le code de sortie 130. Peu importe le nombre de lignes d'entrée que je lui donne avant et entre les deux Control-Cs, ça arrive toujours comme ça. Je sais que je dois manquer quelque chose de simple ... s'il vous plaît, aidez, merci!Catching Control-C exception dans GHC (Haskell)
Remarque: il s'agit d'exceptions de base 4, donc Control.Exception et non 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
Ce code ne sera même pas compilé avec GHC 6.8, en important 'Control.Exception' et' IO'. –
@Norman, GHC 6,12 * est * sortie. Il n'est pas inclus dans la plate-forme Haskell, mais il est déjà disponible pour Arch et Debian Unstable. –
Pourquoi ne pas installer votre propre gestionnaire de signal? http://therning.org/magnus/archives/285 –