在运行GHCI时,如何将stdin从文件路由到函数

时间:2009-11-14 19:48:52

标签: haskell ghci

我在XP的dos命令行使用ghci 6.10.4,在使用haskell-mode-2.4的emacs中使用

当运行在stdin上运行的程序时,有没有办法可以将文件重定向为stdin?例如,如果我有一个名为main的函数从stdin读取,我不能这样做:

*Main> main < words.txt

还有其他办法吗?

此外,我希望能够在ghci窗口中键入stdin,这似乎有效,但是EOF键是什么?我认为这是Ctrl-D但是不起作用。

2 个答案:

答案 0 :(得分: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

在GHCi中,不要在stdin上给出EOF。如果这样做,所有从stdin读取的进一步尝试都将失败:

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

答案 1 :(得分:4)

您可以在GHCi中输入:main来调用命令行参数。我担心你可能只想用它。