在文本文件输出中查找并替换带星号的单词

时间:2012-03-21 19:49:40

标签: haskell

你好我是Haskell的新手,我在尝试让这个脚本工作时遇到了问题。 此脚本从命令行读入参数,并在单独的文本文件中查找。

E.G:cat.txt | ./redact house big cat(编译器中)

它通过用星号( * *)星号替换它们来编辑文本文件中的某些单词。 每个编辑单词使用的星数应该等于 单词中的字符数。

module Main where

import System
import Data.Char
import Data.List

lowercase :: String -> String
lowercase = map toLower

main = do 
arg1 <- getArgs
txt <- getContents
putStr (redact txt arg1)

redact :: String ->[String] -> String
redact input xWords = unlines [ work line | line <- lines input ]
where work line = unwords [ foo word | word <- words line ]
      foo w | lowercase(w) == lowercase(xWords) = convertWord w 1
        | otherwise                         = w

convertWord :: Eq a => [a] -> [a]
convertWord :: map (const '*') 

然而,当我尝试编译它时,GHCi返回错误:“redact.hs:21:27:解析错误输入”'“。 所以代码:

convertWord :: map (const '*') 

造成了这个问题。

最后当我输入:( cat.txt | ./redact house big cat)在编译器中我得到错误:“interactive:1:14:解析错误输入'|' “ 所以我也想要解决这个错误。

的信息: Windows 7的 GHCi编译器,版本7.0.4

3 个答案:

答案 0 :(得分:2)

convertWord :: map (const '*') 

应该是

convertWord = map (const '*') 

使用::提供类型注释。使用=定义函数或变量。

同时,这个

cat.txt | ./redact house big cat

看起来应该是这个

type cat.txt | redact house big cat

直接输入dos提示符(命令提示符),不是在ghci中。 (我假设您要处理的文件名为cat.txt。)

(您正在使用Windows,但您使用的教程似乎假设您使用的是Mac或Linux。)

答案 1 :(得分:1)

convertWord :: map (const '*')

::运算符用于声明具有给定类型的内容。所以上面的一行是说“convertWord具有类型map (const '*')”,这显然没有任何意义。你可能想要=那里。

cat.txt | ./redact house big cat

我不知道是谁告诉你把它写进GHCi,但这不是有效的Haskell代码。它是shell脚本 - 您需要将其键入(unix)shell。

答案 2 :(得分:0)

要提及的另一件事(除了::应该是=)是您为convertWord提供的类型签名是错误的。

您提供的签名Eq a => [a] -> [a]表明,对于支持相等的任何类型,convertWord会将该类型的列表转换为另一个此类列表。因此,Int的列表会被转换为Int的另一个列表。这可能是正确的,因为'*'不是Int

签名应该是什么?好吧,你显然想用它来将String变成另一个String,所以String -> String肯定适用于这个例子。然而,convertWord的最常规类型是[a] -> String,您可以通过询问GHCi(输入:t map (const '*'))或查看map :: (a -> b) -> [a] -> [b]和{{的类型来查找1}}并看看它们是如何匹配的。