0

我能够在respondPalindromes.hs文件中的终端中运行下面的代码,但无法在emacs中测试相同的代码。

响应回文= unlines 。map (\xs -> if isPalindrome xs then "palindrome" else "not a palindrome") 。isPalindrome
xs = xs == reverse xs
main = 交互的行

以下是终端详细信息:

optimight@optimight:~$ cat words.txt | runhaskell respondPalindromes.hs
不是回文
回文
回文回文
回文

下面是 Emacs haskell 模式的详细信息:

*Main> :load "/home/optimight/respondPalindromes.hs"
[1 of 1] 编译 Main (/home/optimight/respondPalindromes.hs, 解释)
好的,模块已加载:Main。
*主要> :! 猫话.txt | ./respondPalindromes.hs
/bin/sh: 1: ./respondPalindromes.hs: Permission denied
*Main> :! 猫话.txt | ./respondPalindromes
/bin/sh: 1: ./respondPalindromes: 未找到
*Main>

在迪特里希·埃普的回答之后编辑:

*Main> !: cat words.txt | runhaskell respondPalindromes.hs
:12:1: 解析输入错误'!:'

*Main> cat words.txt | runhaskell respondPalindromes.hs
:13:15:输入“|”解析错误
*主要>

4

2 回答 2

4

在常规终端窗口中,运行以下命令:

cat words.txt | runhaskell respondPalindromes.hs

但在 Haskell 窗口中,您运行以下 shell 命令:

cat words.txt | ./respondPalindromes.hs

如果第一个命令工作正常,为什么要运行不同的命令?

这些只是普通的 shell 命令。如果您尚未设置respondPalindromes.hs为可执行文件,则它不会作为可执行文件运行,您必须使用runhaskell它才能执行它。

此外,如果您以这种方式运行程序(通过从 Haskell 交互式 shell 中执行 shell 命令),那么使用花哨的 Haskell shell 毫无意义。您还不如使用普通的外壳。

相反,您可能希望完全避免使用 shell,例如:

readFile "words.txt" >>= respondPalindromes >>= putStr

Haskell 中的>>=运算符有点像|外壳中的管道。

总结::!命令执行的是一个普通的shell命令,与Haskell没有任何关系。

于 2012-08-07T01:20:48.913 回答
0

我不知道haskell,但在命令行上你正在执行runhaskell respondPalindromes.hs,但在里面emacs你正在运行./respondPalindromes.hs

很确定这就是问题所在。

于 2012-08-07T00:53:45.690 回答