Здравствуйте, я новичок в Haskell, и у меня проблемы с попыткой заставить этот скрипт работать. Этот скрипт читается в аргументах из командной строки и находит их в отдельном текстовом файле.Поиск и замена слов звездочкой, в текстовом файле
E.G: cat.txt | ./redact house big cat (in compiler)
Он редактирует определенные слова в текстовом файле, заменяя их звездочками (**) звездочками. Число звезд, используемых для каждого отредактированного слова, должно равняться количеству символов в слове.
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:13:38:
Couldn't match expected thye 'Char' with actual type '[Char]'
Expected type: String
Actual type: [String]
In the second argument of 'redact', namely 'arg1'
In the first of 'putStr', namely '<redact txt arg1>'
Failed, module loaded: none.
Поэтому код:
putStr (redact txt arg1)
вызывает проблему.
Заранее благодарю за любую помощь, и если вы можете улучшить код в любом случае, это было бы здорово.
EDIT:
Я хочу, чтобы ввести столько арг, насколько это возможно, оно не имеет значения, сколько арг вы входите, я попробовал:
(arg1:arg2:arg3:arg4:arg5:_) <- getArgs
, но я должен войти ТОЧНЫЕ 5 арг, Не важно, сколько я вхожу в args. Я думал использовать какую-то петлю, но я не уверен?
Снова благодарим вас за помощь.
В соответствии с примером использование аргументов _all_ было тем, чего фактически хотел ОП. – leftaroundabout
@leftaroundabout: Хм, справа. Меня обманули именованием 'arg1'. Ну, надеюсь, остальная часть моего совета будет полезна ... – ehird