Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
297 views
in Technique[技术] by (71.8m points)

Haskell: How to replace a string's character at a given index?

I am looking for a function that replaces a character at a given index.

For example:

replace 4 '!' "Hello World!"
-- Output: "Hell! World!"
question from:https://stackoverflow.com/questions/65648163/haskell-how-to-replace-a-strings-character-at-a-given-index

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can improve it slighly by using replacement : strAfter, and using a safe tail function to prevent an error if the index is greater than the length of the string:

safeTail :: [a] -> [a]
safeTail [] = []
safeTail (_:xs) = xs

replaceCharAtIndex :: Int -> Char -> String -> String
replaceCharAtIndex index replacement str = strHead ++ replacement : safeTail strAfter
    where (strHead, strAfter) = splitAt index str

One however should be careful: for negative indices, it will replace the first character of the string. For indices that are greater than the length of the string, it will append to the string. Both cases are not per se the desired behavior.

We can alter the behavior by checking for negative indexes, and matching on the empty tail:

replaceCharAtIndex :: Int -> Char -> String -> String
replaceCharAtIndex index replacement str
    | index < 0 = … -- index located before the string
    | (_:xs) <- strAfter = strHead ++ replacement : xs
    | otherwise = …  -- index located after the string.
    where (strHead, strAfter) = splitAt index str

Here we thus have two s to fill in a result for these edge-cases.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...