2013-04-28 140 views
0

我遇到了我的函數有問題,我想用函數對字符串進行模式匹配,但是我有將字符串拆分爲子字符串的問題。我想要一個像"ccaabbccaacc"這樣的字符串和像"a*b*c*"這樣的常規表達式來獲得["cc", "aabbcc", "aacc", ""],這是一個帶有分隔子字符串的列表。我做了這個函數返回的字符串將字符串拆分成haskell中的子字符串

parts :: [a] -> [[[a]]] 
parts [ ] = [[ ]] 
parts [c] = [[[c]]] 
parts (c : cs) = concat [[(c : p) : ps ,[c] : p : ps] | p : ps <- parts cs] 

的所有部分,但我申請當我配襯功能公開所有結果返回更多的,我想,我不知道如何來篩選結果。有人能幫助我嗎?

+1

儘管將這樣的問題分解成像這樣簡單的步驟通常是一個好主意,但我認爲這是一個例子,它可以更有效地編寫一個完全完成工作的遞歸函數。你嘗試過嗎? – leftaroundabout 2013-04-28 13:11:07

+0

我試圖做一些遞歸,但它不起作用 – user192837465 2013-04-28 13:29:57

回答

1

我認爲這個問題是關於解析 - 你想要將一個字符串分解成與給定正則表達式匹配的最大塊,例如, 「A * B * C *」。

這就像迭代的詞法分析器應用程序,只有正則表達式。假設的功能存在

reglex :: String -> String -> (String, String) 

接受一個正則表達式串,輸入字符串,並返回一對最長匹配前綴,並且所述輸入串的剩餘部分,我們可以寫出

import Control.Arrow 

parts reg str = ($ ("",str)) $ 
    iterate (reglex reg . snd) >>> 
    tail >>> 
    span (not.null.fst) 

和然後用這個結果做點什麼。

+0

Haskell是否有任何內置函數提取兩個指定索引(從一個特定字符串)之間的子字符串? – 2013-08-05 03:53:29

+1

我們可以通過重複應用'splitAt'來做到這一點:'i str = let(a,b)= splitAt i str; (c,d)= splitAt(j-i)b在c'中,基於零的,不包含「j」。 「簡化」爲「btw i j s = fst」。 splitAt(j-i)。 snd。 splitAt我$ s'。 – 2013-08-05 08:44:52