1

修改很可能只是对 Char ascii 值加 3。我浏览了几本书,找不到现成的解决方案。(返回 Char 列表可以是不同的列表变量。)

4

1 回答 1

6
import Data.Char
shiftAscii :: String -> String
shiftAscii xs = map (chr.(+3).ord) xs

会做你问的。

它之所以有效,是因为map使用提供的函数编辑字符串中的每个字符。

ord将 theChar转换为其Int
(+3)将 (ascii) 移动 3
chr转换回 a 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"
于 2012-11-04T22:33:08.910 回答