2014-01-06 21 views
2

IAM新Haskell和編程功能重複每一個字......沒有計數的時候使用哈斯克爾

我想在函數作爲字符串傳遞和統計沒有時間每個語法,例如(如果,否則,elseif for,while,dowhile)存在於使用haskell的函數中。

例如,如果給這樣

if(i=0){ for(i=0;i<num;i++){if(name== name)} 
}elseif (i=3){for(i=3;i<num;i++){}} 
else{while (i>3){name = name; i--;}} 

我期望的輸出的輸入。(它有得到的倍沒有每個語法出現)

[(if,2),(for,2),(elseif,1),(else,1),(while,1)] 

我已經做了編碼。如下所示

import Control.Arrow 

syntaxCount :: String -> [(String, Int)] 
syntaxCount = map (head &&& length) . group .sort . words 

此功能可以正常工作,但會顯示如下結果。

[("(i=3){for(i=3;i<num;i++){}}",1),("(i>3){name",1),("=",1),("else{while",1),("for(i=0;i<num;i++){if(name==",1),("i--;}}",1),("if(i=0){",1),("name)}",1),("name;",1),("}elseif",1)] 

誰能幫助我擺脫所有不需要的東西,得到這樣的結果..

[(if,2),(for,12),(elseif,1),(else,1),(while,1)] 

回答

4

我分成產生的關鍵字列表中的一個函數這計數列表

import Data.Char 
import Control.Arrow 

keywords :: String -> [String] 
keywords = words . map (\x -> if isAlpha x then x else ' ') 

count :: Ord k => [k] -> [(k,Int)] 
count = map (head &&& length) . group . sort 

接着的不同元件的輸入字符串,和一個函數可以定義syntaxCount作爲一個簡單的組合物

syntaxCount = count . keywords 

例如

>> let inp = "if(i=0){ for(i=0;i<num;i++){if(name== name)}\n}elseif (i=3){for(i=3;i<num;i++){}}\nelse{while (i>3){name = name; i--;}}" 
>> syntaxCount inp 
[("else",1),("elseif",1),("for",2),("i",10),("if",2),("name",4),("num",2),("while",1)] 

如果您想僅包含特定關鍵字的集合,那麼你應該明確地篩選他們

import qualified Data.Set as Set 

allKeywords :: Set.Set String 
allKeywords = Set.fromList ["if", "else", "elseif", "for", "while"] 

keywords = filter (`Set.member` allKeywords) . words . map removePunc 
    where removePunc c = if isAlpha c then c else ' ' 
+0

謝謝。克里斯..你可以請解釋我這是什麼**導入合格Data.Map作爲地圖** .. – 2964349

+1

@Sathyabaman我實際上刪除了這條線爲簡單起見。但是它導入模塊'Data.Map',但是導入它* qualified *,所以你必須通過在它們前面寫入'Data.Map.'來顯式聲明你正在使用該模塊中的函數。通過編寫'導入合格的Data.Map作爲Map',我給了它簡稱'Map',以便我可以使用它的函數作爲'Map.insert'而不是'Data.Map.insert'。 –

+0

我很想知道爲什麼這是downvoted。 –