Как вы маршрутизируете стандартный ввод из файла в функцию при запуске GHCI - PullRequest
6 голосов
/ 14 ноября 2009

Я использую ghci 6.10.4 в командной строке dos в XP, а также в emacs, используя haskell-mode-2.4

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

*Main> main < words.txt

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

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

Ответы [ 2 ]

6 голосов
/ 15 ноября 2009

Это будет проще, если вы переделаете свой 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 на stdin, пока находитесь в GHCi. Если вы это сделаете, все дальнейшие попытки чтения с stdin потерпят неудачу:

Prelude> getLine
*** Exception: <stdin>: hGetLine: illegal operation (handle is closed)
Prelude> getContents
*** Exception: <stdin>: hGetContents: illegal operation (handle is closed)
4 голосов
/ 15 ноября 2009

Вы МОЖЕТЕ набрать: main в GHCi для вызова параметров командной строки. Боюсь, вы, вероятно, просто захотите это использовать.

...