我在XP的dos命令行使用ghci 6.10.4,在使用haskell-mode-2.4的emacs中使用
当运行在stdin上运行的程序时,有没有办法可以将文件重定向为stdin?例如,如果我有一个名为main的函数从stdin读取,我不能这样做:
*Main> main < words.txt
还有其他办法吗?
此外,我希望能够在ghci窗口中键入stdin,这似乎有效,但是EOF键是什么?我认为这是Ctrl-D但是不起作用。
答案 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来调用命令行参数。我担心你可能只想用它。