17

假设我有字符串“HELLO WORLD”,有没有一种方法可以调用一个函数,用字符“X”替换字符串中的字符“O”,以便新字符串看起来像“HELLX WXRLD”?

4

6 回答 6

40

怎么样:

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

如果以后需要替换其他字符,只需在repl函数中添加子句即可。

于 2013-10-23T15:21:53.807 回答
14

很抱歉拿起这个旧线程,但为什么不使用 lambda 表达式?

λ> let replaceO = map (\c -> if c=='O' then 'X'; else c)
λ> replaceO "HELLO WORLD"
"HELLX WXRLD"`
于 2014-07-03T11:14:03.333 回答
14

备选方案 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"

备选方案 3 - 使用 if

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

但要挑剔 - 不需要分号:

replace :: Eq a => a -> a -> [a] -> [a]
replace a b = map $ \c -> if c == a then b else c
于 2016-09-12T15:10:37.387 回答
1

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

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

首先,您设置边缘条件"replaceO [] = []"
如果列表为空,则没有可替换的内容,返回一个空列表。

接下来,我们将字符串分成头部和尾部。在这种情况下,'H':"ELLOWORLD"
如果头部等于“O”,它将用“X”替换它。并将 replaceO 函数应用于字符串的其余部分。
如果 head 不等于 'O',那么它将把 head 放回原来的位置,并将 replaceO 函数应用于字符串的其余部分。

于 2013-10-24T02:39:58.077 回答
1

If you depend on the text package (like 99.99% of Haskell applications), you can use T.replace:

>>> replace "ofo" "bar" "ofofo"
"barfo"
于 2021-03-23T10:01:31.013 回答
-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)
于 2014-07-03T12:17:27.227 回答