修改可能只是Char ascii值的3。 我已经阅读了几本书,无法找到现成的解决方案。 (返回Char列表可以是不同的列表变量。)
答案 0 :(得分:6)
import Data.Char
shiftAscii :: String -> String
shiftAscii xs = map (chr.(+3).ord) xs
会做你要求的。
它有效,因为map
使用提供的函数编辑字符串中的每个字符。
ord
将Char
转换为Int
值
(+3)
将(ascii)移动3
chr
会转换回Char
,
所以chr.(+3).ord
是那些与函数组合.
为了更灵活,你可以写
shiftAsciiBy :: Int -> String -> String
shiftAsciiBy n = map (chr.(+ n).ord)
请注意,移动ascii不会影响字母边界,因此如果您需要执行rot13
编码或类似的简单移位,那么您最好只使用手动移位功能进行编辑字母
addAscii :: Int -> Char -> Char
addAscii n c | isUpper c = chr $ ((ord c - ord 'A' + n) `mod` 26) + ord 'A'
| isLower c = chr $ ((ord c - ord 'a' + n) `mod` 26) + ord 'a'
| otherwise = c
例如
['A'..'z']
"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz"
我们只改变字母表ascii:
map (addAscii 5) ['A'..'z']
"FGHIJKLMNOPQRSTUVWXYZABCDE[\\]^_`fghijklmnopqrstuvwxyzabcde"