如何在Haskell中替换字符串中的多个字符?

Ron*_*Nnn 7 string haskell replace

我正在制作一个程序,使用世界语X-System替换世界语,所以我需要它来将“ cx”转换为“?”,“ sx”转换为“?”,“ gx”转换为“ g”,“ jx”到“?”,“ ux”到“?”,大写字母相同。

当前,它将“ a”转换为“ b”,将“ c”转换为“ d”。我当前使用的方法仅适用于替换单个字符,而不是多个字符。那么,如何替换多个字符(例如“ cx”)而不是单个字符(例如“ a”)?

replaceChar :: Char -> Char
replaceChar char = case char of
                     'a' -> 'b'
                     'c' -> 'd'
                     _   -> char

xSistemo :: String -> String
xSistemo = map replaceChar
Run Code Online (Sandbox Code Playgroud)

因此,当前“猫”将转换为“ dbts”。

Wil*_*sem 11

正如@AJFarmar指出的那样,您可能正在实现世界语的X系统 [wiki]。这里说的是翻译的所有项目都是有向图与结束x时,x不是在esperato本身使用。例如,我们可以为此使用显式递归:

xSistemo :: String -> String
xSistemo (x:'x':xs) = replaceChar x : xSistemo xs
xSistemo (x:xs) = x : xSistemo xs
xSistemo [] = []
Run Code Online (Sandbox Code Playgroud)

我们有一个函数replaceChar :: Char -> Char,例如:

replaceChar :: Char -> Char
replaceChar 's' = '?'
-- ...
Run Code Online (Sandbox Code Playgroud)

然后产生:

Prelude> xSistemo "sxi"
"\349i"
Prelude> putStrLn (xSistemo "sxi")
?i
Run Code Online (Sandbox Code Playgroud)

  • 美丽。我没有写答案,因为我所有的想法似乎都很烦人。现在,我看到了太多的通用性目标—该解决方案优雅,简单,易读,而且显然是正确的。这是从头开始发明的艰难组合。做得好! (5认同)