Haskell 运行GHCI时,如何读取指定为函数参数的文件

Haskell 运行GHCI时,如何读取指定为函数参数的文件,haskell,ghci,Haskell,Ghci,我在XP的dos命令行中使用ghci 6.10.4,在emacs中也使用haskell-mode-2.4 当运行在stdin上运行的程序时,有没有办法将文件重定向到stdin?例如,如果我有一个名为main的函数从stdin读取数据,我就不能执行以下操作: *Main> main < words.txt *Main>Main withFile文件读取模式doStuff doStuff::Handle->IO() 多斯塔夫=… *Main>System.Environment.wi

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

当运行在stdin上运行的程序时,有没有办法将文件重定向到stdin?例如,如果我有一个名为main的函数从stdin读取数据,我就不能执行以下操作:

*Main> main < words.txt
*Main>Main
还有别的办法吗


此外,我希望能够在ghci窗口中键入stdin,这似乎是可行的,但EOF键是什么?我以为是Ctrl-D,但那不行

如果重新编写
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 = …
导入系统环境
导入系统.IO
main::IO()
main=do
args doStuff标准
文件:u->
withFile文件读取模式doStuff
doStuff::Handle->IO()
多斯塔夫=…
*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) 前奏曲>getLine ***异常::hGetLine:非法操作(句柄已关闭) 序曲>获取内容 ***异常::hGetContents:非法操作(句柄已关闭)
您可以在GHCi中键入:main以调用命令行参数。恐怕您可能只想使用它。

我相信dos/windows Ctrl-Z是EOF键……啊,是的。我试过了,认为它失败了,但事实上确实有效,但正如下面的答案所述,它也关闭了stdin,您会收到一条错误消息,如:*Main>:hLookAhead:invalid argument(坏文件描述符)+1哇,他们什么时候添加的?这肯定比
…with args…
要短,这很方便,但你不能像这样重定向stdin::main