0

我将尝试尽可能清楚地解释这一点,因为我是 Haskell 的菜鸟。我使用以下代码制作了一个非常简单的程序:

module Main where
main = interact (unlines . map reverse . lines)

当我运行它并输入main+enter ,然后输入一个单词、句子或任何东西时,我把它反过来了。现在我需要将一个 .txt 文件传递​​给它。但我不能这样做。我正在使用的作业表是这样解释的:

编译程序(从解释器运行它不会正常工作!),然后运行它,同时重定向标准输入以从文件 in.txt 中读取。在 Windows 机器上,这可以使用以下命令来实现:

Main < in.txt

在 Mac 和 Linux 机器上,您需要使用以下命令:

./Main < in.txt

这似乎对我不起作用;当我输入时Main < derp.txt,我得到了错误

<interactive>:3:1: Not in scope: data constructor 'Main'
<interactive>:3:8: Not in scope: 'derp'
<interactive>:3:13: Not in scope: 'txt'

我究竟做错了什么?请记住,我是一个绝对的初学者,所以这个问题可能很愚蠢。

4

4 回答 4

4

编译和运行程序的命令都需要从Windows shell 运行,而不是从 GHCi(Haskell 解释器)运行。我自己不使用 Windows,所以我不知道如何打开它,但是根据About.com 上的这篇文章Windows,您可以通过键入+来获得带有命令提示符快捷方式的菜单X。您也可能因为其他原因已经打开它,例如启动ghci或编译您的程序;我不知道。

打开命令提示符(也称为 shell)后,交互应该如下所示:

C:\some\path> cd \path\to\haskell\directory\
C:\some\path> ghc -o Main Main.hs
[1 of 1] Compiling Main             ( Main.hs, Main.o )
Linking Main ...
C:\some\path> Main < derp.txt
.pred si sihT

您收到的错误表明您是从 GHCi 内部运行命令的;它们是 Haskell 错误,说它找不到命名的变量derptxt也找不到命名的构造函数Main(当然,<只是小于运算符,.是函数组合,所以这些都很好)。

于 2013-09-11T21:04:26.967 回答
3

您还可以使用 runhaskell.exe:

runhaskell Main.hs <derp.txt

它在 Windows 上运行良好。您也可以根据需要省略module Main where和命名.hs文件,Main.hs名称不是强制性的。

于 2013-09-11T21:14:03.083 回答
1

你有没有编译你的程序。

编译它

ghc -o Main FILENAME

其中 FILENAME 是文件的名称。

这应该在 Windows 上创建 Main.exe,在 Mac 和 linux 上创建 Main

于 2013-09-11T20:22:09.760 回答
0

重定向运算符应该可以工作。您可以尝试使用cat并将输出通过管道传输到您的程序:

cat in.txt | ./Main

使用测试文件在我的机器(Mac)上运行

hello
this is a test

我回来

olleh
tset a si siht

重定向版本也适用于我的机器。

于 2013-09-11T20:09:30.190 回答