我正在尝试从文本文件中删除重复文件,我尝试了类似以下的代码;
import Data.List
main = do
let singlewords = []
handle <- readFile "/tmp/foo.txt"
singlewords = words handle
nub singlewords
它当然给出了一个错误,因为我对haskell很新,而且我一直在做一些练习但是我觉得我还有更多的时间来适应它。我非常感谢您的帮助。
答案 0 :(得分:6)
您的代码已修复:
import Data.List
main = do
-- let singlewords = [] -- this line removed
content <- readFile "/tmp/foo.txt"
let singlewords = words content -- added the let keyword
return (nub singlewords) -- added call to return
在第一行写下let singlewords = []
,然后尝试为singlewords
分配一个新值。这不是我们在Haskell中的做法,在使用它们之前不需要“声明”或“定义”名称。
在Haskell中,我们从纯计算中分离出有效的计算(IO
是一种有效的计算)。我们使用
name <- computation
我们使用
绑定纯计算的结果let name = computation
在do
- 阻止。
do
- 块中的最后一行是整个块将计算的内容,因此必须是有效的计算。在您的示例中,您希望返回纯计算的结果,因此必须将结果提升为有效的结果,我们使用return
执行此操作。
要查看要将其输出到控制台的单个单词,可以执行以下几项功能:https://hackage.haskell.org/package/base-4.8.1.0/docs/Prelude.html#g:27。
最简单的方法是使用singlewords
输出列表print
:
main = do
content <- readFile "/tmp/foo.txt"
let singlewords = nub (words content)
print singlewords