Haskell替换字符串中的字符

时间:2013-10-23 14:56:41

标签: haskell

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

6 个答案:

答案 0 :(得分:31)

怎么样:

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:7)

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

答案 3 :(得分:1)

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

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

首先,设置边缘条件"replaceO [] = []"
如果列表为空,则无需替换,返回空列表。

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

答案 4 :(得分:1)

如果您依赖于 text 包(例如 99.99% 的 Haskell 应用程序),则可以使用 T.replace

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

答案 5 :(得分:-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)