Finding and replacing words with asterisk, in a text file output
您好,我是Haskell的新手,我在尝试使此脚本正常工作时遇到问题。该脚本从命令行读取争论,然后在单独的文本文件中找到争论。
例如:cat.txt | ./redact house大猫(在编译器中)
它将文本文件中的某些单词替换为星号(**),以对其进行编辑。每个编辑的单词所用的星标数量应等于该单词中的字符数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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返回错误:
1 2 3 4 5 6 7 |
所以代码:
1 |
造成了问题。
预先感谢您提供的任何帮助,如果您可以以任何方式改进代码,那将是很好的。
编辑:
我想输入尽可能多的参数,无论您输入多少参数,我都尝试过:
1 | (arg1:arg2:arg3:arg4:arg5:_) <- getArgs |
但我必须输入精确的5个参数,我输入多少个参数都没关系。
我当时在考虑使用某种循环,但不确定吗?
再次感谢您的帮助。
要使其与多个参数一起使用,请使用
1 2 |
比较一个单词的小写字母和多个单词的小写字母。后者未定义,您想将其与每个
顺便说一句,即使它只是一个本地函数,也可能不应调用此函数
您可以像这样对结果进行模式匹配:
1 | arg1:_ <- getArgs |
这导致
至于对程序的改进:
-
您可以使用函数组合和
map 而不是列表理解来简化work 的定义:work = unwords . map foo . words (阅读:"在words 的所有元素上映射foo ,然后在unwords 上进行映射") 。 -
redact 可以类似地简化为redact input xWords = unlines . map work . lines $ input 。 -
lowercase(w) 最好写为lowercase w 。
但是您的程序对我来说基本上看起来不错,除了一些奇怪的地方(例如