假设我有字符串“HELLO WORLD”,有没有一种方法可以调用一个函数,用字符“X”替换字符串中的字符“O”,以便新字符串看起来像“HELLX WXRLD”?
问问题
37673 次
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 回答