2011-03-20 200 views
1

我是haskell的新故障,我在嘗試使此腳本正常工作時遇到了相當多的麻煩。其目的是讓它從命令行中讀取參數,並在單獨的文本文件中找到它們。然後用與該詞的長度相同量的星號代替這些詞。我已經設法讓它找到一個替代的話,但自此以後就已經碰壁了。我嘗試了各種各樣的方式,希望有人能夠爲我澄清它。查找並替換文本文件輸出中的單詞

module Main where 

import System 
import Data.Char 

lowercase = map toLower 


main = do (arg1:arg2:arg3:arg4:arg5:_) <- getArgs 
      txt <- getContents 
      putStr (redact txt arg1 arg2 arg3 arg4 arg5) 


redact file w1 w2 w3 w4 w5 = unlines [ process line | line <- lines file ] 
     where process line = unwords [ f word | word <- words line ] 
      f w | lowercase(w) == lowercase(w1) = convertWord w 1 
       | lowercase(w) == lowercase(w2) = convertWord w 1 
       | lowercase(w) == lowercase(w3) = convertWord w 1 
       | lowercase(w) == lowercase(w4) = convertWord w 1 
       | lowercase(w) == lowercase(w5) = convertWord w 1 
       | otherwise = w 

convertWord :: Eq a => [a] -> [a] -> [a] -> [a] 
convertWord [] _ = [] 

convertWord word count = temp 
     where if count == 1 then let temp = "" 
      if count <= length(word) 
         then temp = temp ++ "*" 
          convertWord word count+1 

的想法是,在convertWord部分稱爲並創建星號的字符串,以反饋至要被顯示在輸出中纂。然而,當我嘗試編譯此,GHC返回錯誤「redact.hs:28:13:解析錯誤(可能是不正確的縮進)」提前爲任何幫助

感謝您能提供

湯姆

+3

一個提示,我強烈建議您嘗試避免代碼中的代碼重複。考慮如何將所有「小寫字母(w)==小寫字母(w1)= convertWord w 1 '警衛轉換爲單個。永遠不要複製代碼是一個好習慣。 :) – Tarrasch 2011-03-20 22:31:59

+2

例如,你可以做這樣的事情:'小寫w \'elem \'映射小寫[w1,w2,w3,w4,w5]' – fuz 2011-03-21 07:07:48

回答

6

你想要一個函數,它需要一個字符串,說,"hello",並將它變爲"*****"(都有長度5),是否正確?

只需使用map (const '*')(即函數:))。示例:map (const '*') "hello"收益率"*****"

還有另一種變體,其中輸入參數必須是[Char],而不是[a]。用於map (asTypeOf '*')。但是,你可能不需要這個。

我真的不確定你想要什麼。也許你可以澄清你的例子舉例說明你希望你的函數做什麼。

哦,你的編譯錯誤是由於你用奇怪的方式使用了where語法。 :)

希望這有助於!

+0

這正是我在尋找的非常感謝! – espsquall 2011-03-20 22:15:08

+1

@espsquall [不是一個字。](http://hyperboleandahalf.blogspot。com/2010/04/alot-is-better-than-you-at-everything.html) – ephemient 2011-03-21 18:37:41

1

我儘量給大家介紹一下代碼一些啓示:

我看到的第一件事情,就是你解構參數列表,並將其送入redact。這不太好,因爲你不能提供超過5個單詞。如何使用列表作爲參數並使用lowercase w \ elem` map小寫wList`來檢查條件?

另一件事是列表理解。如果你不想利用它的特殊功能,通常使用一個map來冗餘。也適用塔拉什的提示,以你的代碼,它可能是這樣的:

module Main where 

import System 
import Data.Char 

lowercase :: String -> String 
lowercase = map toLower 

main :: IO() 
main = do args <- getArgs 
      txt <- getContents 
      putStr (redact txt args) 

redact :: String -> [String] -> String 
redact file wList = unlines . map process $ lines file 
     where process = unwords . map f . words 
      f w | lowercase w `elem` map lowercase wList = convertWord w 
       | otherwise        = w 

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

在Haskell,你很快就能學會如何在地圖和褶皺的長期思考。一旦你習慣了它們,你幾乎只會使用庫函數;顯式遞歸很少需要。

+0

一個小問題是,你不需要convertqord的'Eq a =>'。 – Tarrasch 2011-03-21 20:48:25

相關問題