2009-11-14 8 views
5

sto usando ghci 6.10.4 a riga di comando DOS in XP, e anche in emacs utilizzando Haskell-mode-2.4Come si fa rotta stdin da un file a una funzione quando si esegue GHCI

Durante l'esecuzione di programmi che funziona su stdin, c'è un modo per reindirizzare un file da stdin? Per esempio, se ho una funzione chiamata principale che legge da standard input, non posso fare:

*Main> main < words.txt 

C'è un altro modo?

Inoltre, vorrei poter digitare stdin nella finestra ghci, che sembra funzionare, ma quale è la chiave EOF? Ho pensato che fosse Ctrl-D ma non funziona.

+3

Credo in dos/windows Ctrl-Z è il tasto EOF ... – Suppressingfire

+0

Ah sì. L'ho provato e ho pensato che non funzionasse, ma in realtà funziona, ma poi come dice la risposta, chiude anche stdin e ricevi un messaggio di errore come: * Main>: hLookAhead: argomento non valido (descrittore di file errato) – justinhj

risposta

6

Questo sarà più facile se si rielaborare il main per aprire il file stesso.

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 

non danno un EOF su stdin, mentre all'interno GHCi. Se lo fai, ogni ulteriore tentativo di leggere da stdin fallirà:

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

Grazie, è utile. – justinhj

+0

In Cygwin, CTRL + C sembra annullare un'operazione mentre chiude anche l'handle del file? Come si annulla l'operazione senza chiudere la maniglia? – CMCDragonkai

3

È possibile digitare: principale GHCi per richiamare i parametri della riga di comando. Temo che probabilmente vorrai semplicemente usarlo.

+1

+1 Whoa, quando l'hanno aggiunto? Questo è decisamente più breve di '... withArgs ...' – ephemient

+3

Questo è utile ma non puoi reindirizzare lo stdin in questo modo: : main justinhj

+1

Scusa l'efemma, ma non ho usato haskell a lungo, quindi è qui da tanto tempo Posso ricordare. E justinhj, perché non provarlo? main = do {args <- getArgs; lasciate file = head args; contenuto <- file readFile; hPutStr stdin contents; ...} Quindi puoi fare: main words.txt – codebliss

Problemi correlati