String 如何将字符串转换为ASCII,然后再转换回Haskell?

String 如何将字符串转换为ASCII,然后再转换回Haskell?,string,haskell,String,Haskell,我是Haskell(从今天早上开始)的初学者,我正在尝试创建一个函数来加密字符串,方法是将字符串转换为ASCII,将指定的整数添加到ASCII,然后再转换回字符串。我想我已经正确地对单个字符执行了此操作,但在涉及完整字符串时,我被卡住了: import Data.Char encodeChar :: Char -> Int -> Char encodeChar 'x' y = chr ((ord 'x') + y) encode :: String -> Int ->

我是Haskell(从今天早上开始)的初学者,我正在尝试创建一个函数来加密字符串,方法是将字符串转换为ASCII,将指定的整数添加到ASCII,然后再转换回字符串。我想我已经正确地对单个字符执行了此操作,但在涉及完整字符串时,我被卡住了:

import Data.Char

encodeChar :: Char -> Int -> Char
encodeChar 'x' y = chr ((ord 'x') + y)

encode :: String -> Int -> String
encode (x : xs) y = chr ((ord (x : xs)) + y)

要对字符串进行编码,一个选项是递归进行。首先,我们选择如何对空列表进行编码。然后,假设
encodexsy
完成了它的工作,我们定义
encode(x:xs)y
应该是什么

经过一些思考,我们可以看到
encode(x:xs)y
应该是一个字符串,其第一个字符是使用
y
x
进行编码,即
encodeChar xy
,而该字符串的其余部分(尾部)是使用
y
xs
进行编码,即递归调用的结果

然后我们获得:

encode :: String -> Int -> String
encode []       y = []
encode (x : xs) y = encodeChar x y : encode xs y
这种递归非常常见,因此有一个库函数,
map
,可以为我们执行它

map f[x1,…,xn]
返回
[f x1,…,f xn]
。因此,我们可以在整个字符串上映射
encodeChar
函数

encode :: String -> Int -> String
encode xs y = map (\x -> encodeChar x y) xs
-- or, using more advanced functions
encode xs y = map (flip encodeChar y) xs

你会在haskell标签的“信息”部分找到一些好的信息,其中一个信息会指向hoogle,你可以用它来回答你的问题,为什么你认为一个字符就可以正确地完成它?你测试过了吗?通过运行
ghci nameofyourfile.hs
然后键入,比如说,
encodeChar'a'5
Immibis,您应该能够非常轻松地测试它,我已经测试过了,它似乎可以工作。然而,我在应用上面Alec建议的map函数时遇到了一个错误*editOops!我并不惊讶我的评论不起作用——我只是惊讶有人投了赞成票
encodesy=map(`encodeChar`y)s
应该是这样的。@SyedAhamed我想你没有,因为你的
encodeChar
只对字母x有效