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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…