0

我有创建 Data.Map 的代码:

import qualified Data.Map as Map

shift_string :: [Char] -> Int -> [Char]
shift_string s num = (drop num s) ++ (take num s)

ascii :: [Char]
ascii = ['a' .. 'z']

shifted_ascii :: Int -> [Char]
shifted_ascii n = shift_string ascii n

trans_table :: Int -> Map.Map Char Char
trans_table n = Map.fromList(zip ascii $ shifted_ascii n)

'trans_table' 函数返回一个字符映射到另一个映射的映射。我可以创建函数来获取一个 Char 并基于此 Map 返回另一个 Char:

translate_char :: Char -> Int -> Maybe Char
translate_char c n = Map.lookup c $ trans_table n

现在我想“翻译”地图中的每个符号。像这样的东西:

encode message key = map translate_char message

此代码不起作用,因为 translate_function 必须只有一个参数。我需要像全局变量这样的东西来将地图存储在其中,并在我的地图函数中从中查找值。但我不知道如何重写我的代码。

ps 我想我可以在字符串中的每个字符中添加“键”,但我正在寻找通用解决方案。

4

1 回答 1

1

我不知道您的编码功能中的关键是什么,但您可以使用类似的东西

translate_char :: Int -> Char -> Maybe Char
translate_char n c = Map.lookup c $ trans_table n

encode :: Int -> String -> String
encode n s = catMaybes $ map (translate_char n) s

这里 n 确定您正在旋转的字符数。我切换了参数的顺序以避免使用flip.

于 2012-10-27T19:26:23.627 回答