【发布时间】:2015-08-31 18:04:07
【问题描述】:
我正在尝试编写一个 Haskell 函数,该函数接受一串成对的字母,并在所有字母的字符串中交换成对的字母,但我想出的东西感觉很尴尬和不习惯。
我有
swap a b = map (\x-> if x == a then b else if x == b then a else x)
sub n = foldr (.) id (zipWith swap (head <$> splitOn "." n) (last <$> splitOn "." n)) ['A'..'Z']
效果很好,给予
> sub "RB.XD.EU.ZM.IJ"
"ARCXUFGHJIKLZNOPQBSTEVWDYM"
和
> sub "YC.LU.EB.TZ.RB.XD.IJ"
"ARYXBFGHJIKUMNOPQESZLVWDCT"
但我是 Haskell 的新手,我觉得我的方法——尤其是我的 swap 辅助函数(我只在这里使用)——比它需要的更复杂。
有没有更好、更惯用的方法来解决这个问题?尤其是利用了我错过的语言特性、内置函数或库函数的函数?
【问题讨论】:
-
请注意,您可以将
"ABCDE..."写为['A'..'Z'],因为Char是Enum的一个实例。