在.txt文件上执行函数

时间:2013-09-11 20:02:46

标签: haskell ghc

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

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

当我运行它并键入main +输入然后输入单词,句子或任何内容时,我会将其反转。现在我需要将.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 个答案:

答案 0 :(得分:4)

编译和运行程序的命令都需要从 Windows shell运行,而不是从GHCi(Haskell解释器)运行。我自己不使用Windows,因此我不知道如何将其打开,但根据this article on 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的构造函数(当然,<只是小于运算符,.是函数组合,所以很好。)

答案 1 :(得分:3)

您也可以使用runhaskell.exe:

runhaskell Main.hs <derp.txt

在Windows上运行正常。您也可以省略module Main where并为.hs文件命名,Main.hs名称不是强制性的。

答案 2 :(得分:1)

你编译了你的程序。

编译
ghc -o Main FILENAME

其中FILENAME是文件的名称。

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

答案 3 :(得分:0)

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

cat in.txt | ./Main

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

hello
this is a test

我回来了

olleh
tset a si siht

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