Search code examples
haskellghci

How do you read a file specified as a parameter to a function when running GHCI


I'm using ghci 6.10.4 at the dos command line in XP, and also in emacs using haskell-mode-2.4

When running programs that operate on stdin, is there a way I can redirect a file to be stdin? For example if I have a function called main that reads from stdin, I can't do:

*Main> main < words.txt

Is there another way?

Also I would like to be able to type stdin into the ghci window, which seems to work, but what is the EOF key? I thought it was Ctrl-D but that doesn't work.


Solution

  • This will be easier if you rework your main to open the file itself.

    import System.Environment
    import System.IO
    
    main :: IO ()
    main = do
        args <- getArgs
        case args of
          [] -> doStuff stdin
          file:_ ->
            withFile file ReadMode doStuff
    
    doStuff :: Handle -> IO ()
    doStuff = …
    
    *Main> System.Environment.withArgs ["main.txt"] main
    

    Don't give a EOF on stdin while within GHCi. If you do, all further attempts to read from stdin will fail:

    Prelude> getLine
    *** Exception: <stdin>: hGetLine: illegal operation (handle is closed)
    Prelude> getContents
    *** Exception: <stdin>: hGetContents: illegal operation (handle is closed)