2013-10-23 48 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