如何编写一个函数来修改Char列表并在Haskell中返回它?

时间:2012-11-04 22:30:15

标签: haskell

修改可能只是Char ascii值的3。 我已经阅读了几本书,无法找到现成的解决方案。 (返回Char列表可以是不同的列表变量。)

1 个答案:

答案 0 :(得分:6)

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

会做你要求的。

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

ordChar转换为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"