我必须制作三个函数来替换扁平字符串和列表。
我不知道,是否有像其他语言一样的替换功能。我搜索了那个但不幸的是没有成功: - (
所以我的尝试还很薄。
第一个功能:
replace :: String -> String -> String -> String
replace findStr replaceStr myText = replace()??
我对第一个功能的处理方法:
replace :: String -> String -> String -> String
replace [] old new = []
replace str old new = loop str
where
loop [] = []
loop str =
let (prefix, rest) = splitAt n str
in
if old == prefix -- found an occurrence?
then new ++ loop rest -- yes: replace
else head str : loop (tail str) -- no: keep looking
n = length old
第二功能:
replaceBasedIdx :: String -> [String] -> String -> String
replaceBasedIdx findStr replaceStrList myText = replace()???
这个函数应该替换myTxt中的第一个findStr和replaceStrList的第一个元素,第二个findStr和第二个元素等等......
示例:
replaceBasedIdx "a" ["G","V","X"] "Haskell is a language"
"HGskell is V lXnguage"
我对第二个功能的处理方法:
replaceBasedIdx :: String -> [String] -> String -> String
replaceBasedIdx findStr replaceStrList myText = replaceBasedIdxSub findStr replaceStrList myText 0
replaceBasedIdxSub :: String -> [String] -> String -> Int -> String
replaceBasedIdxSub findStr replaceStrList myText counter = loop myText
where
loop [] = []
loop myText =
let (prefix, rest) = splitAt n myText
in
if findStr == prefix -- found an occurrence?
then (replaceStrList !! (counter+1)) ++ loop rest -- yes: replace it
else head myText : loop (tail myText) -- no: keep looking
n = length findStr
我现在非常接近最终结果,但计数器不会增加。
你可以告诉我,我的错误在哪里吗? 我怎么能修改第一个或第二个函数来获得第三个函数呢?第三功能:
replaceBasedIdxMultiple :: [String] -> [String] -> String -> String
replaceBasedIdxMultiple findStrList replaceStrList myText = replace()???
这个函数应该用mySxt中的相应元素替换myTxt中findStrList的每个元素,所以1.用1.,2。用2.等等......
示例:
replaceBasedIdxMultiple ["A","X","G"] ["N","Y","K"] "ABXMG"
"NBYMK"
你可以帮我这个吗?一些提示和提示,如何开始呢?
我真是完全不同: - (
提前多多感谢
亲切的问候!
答案 0 :(得分:6)
replace存在Data.List.Utils
MissingH
包的一部分。
实际上,这是一个非常简洁的实现:
replace :: Eq a => [a] -> [a] -> [a] -> [a]
replace old new = join new . split old
答案 1 :(得分:1)
首先,join
是一个错误的名称that's already a standard function。另外,我不知道为什么你这样定义这个函数 - 它似乎没有做任何有用的事情。
但是好的,你确实尝试了一些东西。现在让我们找到一个合适的解决方案......
在Haskell中通常是一个好主意,我们希望将其分解为子问题。首先需要的是找到您要替换的子字符串。这可能看起来像
locateSub :: (Eq a) =>
[a] -- ^ The sought sublist.
-> [a] -- ^ The source list.
-> Maybe ([a],[a]) -- ^ Everything to the left and, if found, everything
-- to the right of the sought sublist. No need to return
-- the sublist itself in between since we already know it!
使用此功能,replace
很简单:
replace oldSub newSub list
= case locateSub oldSub list of
Nothing -> list -- Sublist not found: we're done already!
Just (l, r) -> l ++ newSub ++ replace oldSub newSub r
replaceBasedIdx
并不困难,你只需要递归newSub
列表,而不是按原样传递它。
所以你需要做的是实现locateSub
。使用isPrefixOf
,您已经走上正轨。实际上它看起来很像你的_replace
(顺便说一句:在Haskell中使用素数'
而不是下划线来命名函数的“局部变体/助手”,所以你宁可称之为replace'
。)