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」関数は、1 つの Char が別のマップにマップされる Map を返します。この Map に基づいて、1 つの Char を取得し、別の 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 にはパラメーターが 1 つしかないため、このコードは機能しません。マップを格納し、マップ関数で値を検索するには、グローバル変数のようなものが必要です。しかし、コードを書き直す方法がわかりません。

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 に答える