2011-04-29 87 views
2
exchangeSymbols "a§ b$ c. 1. 2. 3/" = filter (Char.isAlphaNum) (replaceStr str " " "_") 

上面的代碼應該首先將所有「空格」替換爲「_」,然後根據Char.isAlphaNum過濾字符串。不幸的是,Char.isAlphaNum部分吸收已經交換的「_」,這不是我的意圖,我想保留「_」。所以,我認爲這將是很好,只需添加一個例外,它是這樣的過濾器:Haskell過濾器選項級聯

exchangeSymbols "a§ b$ c. 1. 2. 3/" = filter (Char.isAlphaNum && /='_') (replaceStr str " " "_") 

您看到添加的&& not /='_'。它產生了一個parse error,顯然不太可能連接過濾器選項,但有沒有一個聰明的解決方法?我考慮過包裝過濾功能,就像每次遞歸1000次左右,添加新的過濾測試(/='!'),(/='§')等等,而不添加(/='_')。但它似乎並不是一個方便的解決方案。

+0

請仔細閱讀後整體,然後回答delnan。 – kiltek 2011-04-29 20:58:38

+0

沒關係,我讀了「補充」和我疲倦的大腦,雖然有第二個= /抱歉。 – delnan 2011-04-29 21:19:45

回答

6

... filter (Char.isAlphaNum && /='_') ...

實際上是一個類型的錯誤(爲什麼它產生一個解析錯誤也許是您所使用的理由/ =爲前綴 - 但它的中綴運算符)。由於它是布爾運算符(不是函數)上的運算符,因此不能將函數(&&)結合使用。

NOTE:事實上這個代碼剪斷應改爲:

... filter (\c -> Char.isAlphaNum c && c /= '_') ...

+1

嘿,它看起來像你開始使用'C'然後切換到'X',所以我繼續爲你解決這個問題。 :) – alternative 2011-04-29 21:32:04

+0

同上,Char.isAlphaNum是佔優勢的,再次不是我想要的輸出。我會嘗試很長的路,並通過連接多重過濾功能來定義一個'filterAllSignsEXCEPT_SPACE_CHAR'。 – kiltek 2011-04-29 21:58:51

+3

將'&&'更改爲'||',將'/ ='更改爲'==',並且它應該可以工作,因爲您希望那些是_either_字母數字_或下劃線。 – hammar 2011-04-29 22:05:28

3

用列表理解替換你的過濾器。

[x | x <- replaceStr str " " "_", x /= '_', Char.isAplhaNum x]

當然,你可能希望有多個異常。所以定義一個輔助函數:

notIn :: (Eq a) => [a] -> a -> Bool 
notIn [] _ = True 
notIn x:xs y = if x == y 
        then False 
        else notIn xs 

編輯:顯然,你可以使用notElem :: (Eq a) => a -> [a] -> Bool代替。爲了教育目的,保留上面的代碼。

和使用,在您的列表理解:

[x | x <- replaceStr str " " "_", notElem x "chars to reject", Char.isAlphaNum x]

未經檢驗的,因爲Haskell是不是這臺機器上安裝。如果您在過濾器後執行地圖,則可以獲得獎勵積分,因爲您可以將其放入列表理解中。

編輯2:試試這個,我也跟着你的腳步,而不是想出來自己:

[x | x <- replaceStr str " " "_", Char.isAlphaNum x || x == ' '] 
[x | x <- replaceStr str " " "_", Char.isAlphaNum x || x `elem` "chars to accept"] 

此時列表理解沒有太大幫助。我改變它的唯一原因是因爲我請求了一個&&,因爲使用列表理解很好。

既然你似乎不太瞭解列表理解的原則,其基本應用了一堆的過濾器,然後用多個源的地圖,例如:

[(x, y, x + y) | x <- [1, 2, 3, 4, 5], y <- [2, 4], x > y]

+0

您的'notIn'在Prelude中定義爲'notElem'。 (儘管爭論的順序相反)。 – hammar 2011-04-29 21:12:35

+0

@hammar謝謝!我懷疑它可能是。應該引起那個注意;我知道elem,但當時並沒有真正考慮它。 – alternative 2011-04-29 21:13:56

+0

究竟應該放置'notIn'還是'notElem'? – kiltek 2011-04-29 21:15:58