2009-11-14 1 views
5

Я использую GHCI 6.10.4 в командной строке дос в XP, а также в Emacs, используя Haskell-режим-2,4Как вам маршрут стандартного ввода из файла в функции при работе GHCI

При запуске программы которые работают на stdin, есть ли способ перенаправить файл в stdin? Например, если у меня есть функция под названием основной, который считывает из стандартного ввода, я не могу сделать:

*Main> main < words.txt 

Есть ли другой способ?

Также хотел бы иметь возможность вводить stdin в окно ghci, которое, похоже, работает, но что такое ключ EOF? Я думал, что это Ctrl-D, но это не работает.

+3

Я верю в dos/windows Ctrl-Z является ключом EOF ... – Suppressingfire

+0

Ах да. Я пробовал это и думал, что это не сработало, но на самом деле работает, но затем, как сказано ниже, он также закрывает stdin, и вы получаете сообщение об ошибке вроде: * Main>: hLookAhead: недопустимый аргумент (дескриптор файлового файла) – justinhj

ответ

6

Это будет проще, если вы переработаете свой main, чтобы открыть сам файл.

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 

Не давайте EOF на стандартный ввод в то время как в GHCi. Если да, то все дальнейшие попытки чтения из стандартного ввода не получится:

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

Спасибо, это полезно. – justinhj

+0

В Cygwin, CTRL + C, похоже, отменяет операцию, одновременно закрывая дескриптор файла? Как отменить операцию, не закрывая ручку? – CMCDragonkai

3

Вы можете набрать: главный в GHCi для вызова параметров командной строки. Боюсь, вы, вероятно, просто захотите это использовать.

+1

+1 Кто, когда они это добавили? Это определенно короче, чем '... withArgs ...' – ephemient

+3

Это удобно, но вы не можете перенаправить stdin следующим образом: : main justinhj

+1

Извините, но я не использовал haskell long так, чтобы он был здесь до тех пор, пока Я помню. И justinhj, почему бы не попробовать это? main = do {args <- getArgs; let file = head args; содержимое <- файл readFile; содержание hPutStr stdin; ...} Затем вы можете сделать: main words.txt – codebliss

Смежные вопросы