2013-10-23 46 views
5

假如我有字符串“Hello World”,是有办法,我可以调用以字符的字符串替换字符“O”功能“X”,使新的字符串会是什么样子“HELLX WXRLD”?哈斯克尔替换字符的字符串

+1

的可能重复[?我怎么能替换另一个在Haskell一个字符串的一个子,而无需使用外部库,例如MissingH(HTTP:/ /stackoverflow.com/questions/14880299/how-can-i-replace-a-substring-of-a-string-with-another-in-haskell-without-using) – Orbling

+6

你搜索,就好象这个问题已经来临多次。 – Orbling

回答

26

如何:

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

如果以后需要更换其他字符,只需添加条款的repl功能。

+0

哦,我明白了。我的解决方案确实有点复杂。 –

+2

模式匹配是王道。 – reem

+0

你可以在一行中使用拉姆达吗?如果是这样,另一个+1从我:) – vikingsteve

1

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

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

首先,你设置的边缘状态"replaceO [] = []"
如果列表为空,则无法替换,返回空列表。

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

9

对不起,我拿起这个古老的线程,但为什么不使用lambda表达式?

λ> let replaceO = map (\c -> if c=='O' then 'X'; else c) 
λ> replaceO "HELLO WORLD" 
"HELLX WXRLD"` 
-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) 
3

备选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 - 使用如果

阿蒙的建议可能是最好的,我相信!没有进口,便于阅读和理解!

但挑剔 - 有没有必要分号:

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