【问题标题】:Haskell Replace characters in string with stringHaskell用字符串替换字符串中的字符
【发布时间】:2015-04-20 15:48:27
【问题描述】:

这是这个问题的延伸:Haskell replace characters in string

我想调整以下表达式以将字符替换为字符串

let replaceO = map (\c -> if c=='O' then 'X'; else c)

最后,我会得到以下结果(XX可以是任意长度的字符串):

replaceO "HELLO WORLD"
"HELLXX WXXRLD"

【问题讨论】:

  • 您将无法仅使用map 执行此操作,请查看concat 并考虑(\c -> if c == 'O' then "X" else [c])。请注意,每个字符都变成了一个字符串。
  • 这看起来很有希望,但它是否适用于这样的事情:map (\x -> if x elem guesses then x else '-') word
  • 你到底想做什么?您在此处的评论需要更多上下文才能充分理解。如果您尝试用另一个字符替换某些字符,那么您需要map。如果您尝试用新字符串替换某些字符,请使用concatMap

标签: string haskell replace char


【解决方案1】:

你可以使用concatMap:

let replace0 = concatMap (\c -> if c=='O' then "X" else "XX")

【讨论】:

【解决方案2】:

您可以根据条件遍历和累积来表述您的问题,就像这样,

replace :: String -> Char -> String -> String
replace xs c s = foldr go [] xs

 where go x acc = if x == c  then acc ++ s
                             else acc ++ [x]

以你为例:

>replace "HELLO WORLD" 'O' "XXX" 
> "HELLXXX WXXXRLD"

【讨论】:

  • AFAICS,这具有二次复杂性。附加“在右边”是低效的。我会改用foldr,或者改用concatMap(正如@Lee 建议的那样)。
猜你喜欢
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
相关资源
最近更新 更多