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