2015-02-11 37 views
0

我是在處理haskell中的文件時使用的新手段。我編寫了一個代碼來檢查.c文件中是否出現文字。單詞列在.txt文件中。從Haskell中的文件中擴展縮寫詞

例如:

abbreviations.txt 
ix=index 
ctr=counter 
tbl=table 

另一個文件是:在遇到ix應該擴大到index和同爲ctrtbl

main.c 
main() 
{ 
ix = 1 
for (ctr =1; ctr < 10; ctr++) 
{ 
    tbl[ctr] = ix 
} 
} 

這是我寫檢查事件(尚未更換遇到的單詞)

import System.Environment 
import System.IO 
import Data.Char 
import Control.Monad 
import Data.Set 

main = do 
    s <- getLine 
    f <- readFile "abbreviations.txt" 
    g <- readFile s 
    let dict = fromList (lines f) 
    mapM_ (spell dict) (words g) 

spell d w = when (w `member` d) (putStrLn w) 

上執行它給沒有輸出的代碼。

,而不是上的代碼,我試圖閱讀使用hgetLine然後使用words

 getLines' h = do 
      isEOF <- hIsEOF h 
      if isEOF then 
      return() 
      else 
      do 
      line <- hGetLine h 
      list<-remove (return (words line)) 
      getLines' h 
      -- print list 
    main = do 
     inH <- openFile "abbreviations.txt" ReadMode 
     getLines' inH 
     hClose inH 


    remove [] = [] 
    remove (x:xs)| x == "=" = remove xs 
         | otherwise = x:remove (xs) 

但它讓我與IO(錯誤)的文件將其轉化成單詞列表,是否有任何其他方式我可以做到以下幾點。

我哪裏錯了?

謝謝你的幫助。

+1

使用''if w' member'd then putStrLn d else return()''(else是強制性的)或使用'when'代替。 – chi 2015-02-11 09:40:31

+0

我做了'spell d w = when(w'member' d)(putStrLn w)',仍然沒有輸出。 – anujuhi01 2015-02-11 09:45:58

+0

檢查ghci中的字典類型。我懷疑你沒有按照你的預期生成地圖 – OllieB 2015-02-11 10:02:50

回答

3

首先,你的法術功能有問題。它也應該有一個else子句與它:

spell :: (Show a, Ord a) => Set a -> a -> IO() 
spell d w = if (w `member` d) 
      then print d 
      else return() 

另外請注意,我已經改變了putStrLnprint並增加了一個類型簽名到您的代碼。

在執行代碼時,它沒有輸出。

這是因爲,它總是會進入spell函數的else子句。如果您嘗試追查程序的執行情況,那麼您會注意到,您的dict變量實際上將包含此設置:["ctr=counter","ix=index","tbl=table"]並且它不包含文件main.c的文字。我希望這足以讓你開始。

+0

代替上面的代碼,我嘗試使用'hgetLine'讀取文件,然後使用'words'將其轉換爲單詞列表 – anujuhi01 2015-02-13 05:42:54