Haskell替换字符串中的字符

21
假设我有一个字符串 "HELLO WORLD",有没有一种方法可以调用一个函数,将字符串中的字符 'O' 替换为字符 'X',使新字符串看起来像 "HELLX WXRLD"?
假设我有字符串 "HELLO WORLD",是否有一种方法可以调用一个函数,将字符串中的字符 'O' 替换为字符 'X',从而生成新的字符串 "HELLX WXRLD"?

6
你有没有搜索过?因为这个问题已经出现了很多次。 - Orbling
1
如果你想替换一个 Data.Text,请使用 replace - mb21
7个回答

40

如何:

let 
    repl 'o' = 'x'
    repl  c   = c
in  map repl "Hello World"

如果您需要稍后替换其他字符,只需向repl函数添加子句即可。


1
哦,我明白了。我的解决方案确实有点复杂。 - Aadit M Shah
4
模式匹配是王者。 - reem
1
你能用一个lambda表达式在一行中完成这个吗?如果可以,我再给你点赞 :) - vikingsteve
@vikingsteve 在一行代码中,为什么不呢?map (\case ....) "Hello World"(只需填写... :) - Ingo

15

很抱歉翻起这个旧帖,但为什么不使用lambda表达式呢?

λ> let replaceO = map (\c -> if c=='O' then 'X'; else c)
λ> replaceO "HELLO WORLD"
"HELLX WXRLD"`

15

替代方案1 - 使用MissingH

首先:

import Data.List.Utils (replace)

然后使用:

replace "O" "X" "HELLO WORLD"

方案2 - 使用 Control.Monad

一个滑稽的家伙:

import Control.Monad (mfilter)

replace a b = map $ maybe b id . mfilter (/= a) . Just

示例:

λ> replace 'O' 'X' "HELLO WORLD"
"HELLX WXRLD"

替代方案三 - 使用if语句

我认为,Amon的建议可能是最好的!没有导入,并且易于阅读和理解!

但是,如果要挑刺的话 - 这里不需要分号:

replace :: Eq a => a -> a -> [a] -> [a]
replace a b = map $ \c -> if c == a then b else c

4

如果你依赖于 text 包(像 99.99% 的 Haskell 应用程序一样),你可以使用 T.replace

>>> replace "ofo" "bar" "ofofo"
"barfo"

1
replace :: Char -> Char -> String -> String
replace _ _ [] = []
replace a b (x : xs) 
                  | x == a = [b] ++ replace a b xs
                  | otherwise = [x] ++ replace a b xs

我是Haskell的新手,我尝试让它更简单易懂,以便其他像我一样的人也能学习。


1

这里是使用分治法的另一种可能解决方案:

replaceO [] = []
replaceO (x:xs) = 
     if x == 'O' 
     then 'X' : replaceO xs 
     else x : replaceO xs

首先,您需要设置边缘条件"replaceO [] = []"。 如果列表为空,则没有要替换的内容,返回一个空列表。
接下来,我们将字符串分成头部和尾部。在本例中是'H':"ELLOWORLD"。如果头部等于'O',则将其替换为'X',并将replaceO函数应用于剩余的字符串。如果头部不等于'O',则将其放回原处,并将replaceO函数应用于剩余的字符串。

-2

我觉得这可能会很有用。

main = print $ charRemap "Hello WOrld" ['O','o'] ['X','x']

charRemap :: [Char] -> [Char] -> [Char] -> [Char]
charRemap [] _ _ = []
charRemap (w:word) mapFrom mapTo =
    if snd state
        then mapTo !! fst state : charRemap word mapFrom mapTo
        else w : charRemap word mapFrom mapTo
    where
        state = hasChar w mapFrom 0

hasChar :: Char -> [Char] -> Int -> (Int,Bool)
hasChar _ [] _ = (0,False)
hasChar c (x:xs) i | c == x = (i,True)
                   | otherwise = hasChar c xs (i+1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接