2013-04-28 177 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