String 在haskell中将字符串分解为子字符串

String 在haskell中将字符串分解为子字符串,string,haskell,String,Haskell,我的函数有问题,我想用我的函数对字符串进行模式匹配,但我在将字符串分解为子字符串时遇到问题。我想要一个像“ccaabbccaacc”这样的字符串和一个像“a*b*c*”这样的正则表达式来获得[“cc”,“aabbcc”,“aacc”,“”“],一个包含断开的子字符串的列表。我做了这个函数,它返回子字符串的所有部分 parts :: [a] -> [[[a]]] parts [ ] = [[ ]] parts [c] = [[[c]]] parts (c : cs) = concat [[(

我的函数有问题,我想用我的函数对字符串进行模式匹配,但我在将字符串分解为子字符串时遇到问题。我想要一个像
“ccaabbccaacc”
这样的字符串和一个像
“a*b*c*”
这样的正则表达式来获得
[“cc”,“aabbcc”,“aacc”,“”“]
,一个包含断开的子字符串的列表。我做了这个函数,它返回子字符串的所有部分

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

parts(c:cs)=concat[[(c:p):ps[c]:p:ps]| p:ps我认为这个问题是关于解析的——你想把一个字符串分解成与给定regexp匹配的最大块,例如“a*b*c*”

这类似于迭代lexer应用程序,只使用regexp

reglex :: String -> String -> (String, String)
它接受一个regexp字符串,一个输入字符串,并返回一对最长的匹配前缀,其余的输入字符串,我们可以编写

import Control.Arrow

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

然后用这个结果做一些事情。

虽然像你在这里做的那样把这样的问题分解成简单的步骤通常是个好主意,但我认为这是一个更有效的例子,在这个例子中,编写一个完全完成任务的递归函数。你试过了吗?我试过做一些递归的事情,但没有成功是否有任何内置函数用于在两个指定索引(从一个特定字符串)之间提取子字符串?我们可以重复应用
splitAt
between i j str=let(a,b)=splitAt i str;(c,d)=splitAt(j-i)b in c
,零基,不包含
j
“简化”作为
btw i j s=fst.splitAt(j-i).snd.splitAt i$s