4

我必须创建三个函数来替换扁平字符串和列表。

我不知道,是否有像其他语言一样的替换功能。我搜索了但不幸的是没有成功:-(

所以我的尝试还很薄弱。

第一个功能:

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()???

这个函数应该用replaceStrList中的相应元素替换myTxt中findStrList的每个元素,所以1.用1.,2.用2.等等......

例子:

replaceBasedIdxMultiple ["A","X","G"] ["N","Y","K"]  "ABXMG"
"NBYMK"

你能帮我解决这个问题吗?一些提示和提示,如何开始呢?

我真的很不一样:-(

非常感谢提前

亲切的问候!

4

2 回答 2

6

替换存在于Data.List.Utils,MissingH包的一部分。

实际上,这是一个非常简洁的实现:

replace :: Eq a => [a] -> [a] -> [a] -> [a]
replace old new = join new . split old
于 2013-05-07T23:35:02.363 回答
1

首先,join这是一个坏名字,因为它已经是一个标准功能。另外,我不知道你为什么用这种方式定义这个函数——它似乎没有做任何有用的事情。

但是,好吧,你确实尝试了一些东西。所以现在让我们找到一个合适的解决方案......

在 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并不难,你只需要递归一个newSubs 列表而不是总是按原样传递它。

所以你需要做的是实施locateSubisPrefixOf你已经在正确的轨道上。实际上,它看起来很像您的_replace(顺便说一句:在 Haskell 中,习惯使用素数'而不是下划线来命名函数的“本地变体/助手”,所以您宁愿称它为replace'。)

于 2013-05-07T20:36:04.667 回答