私には2つの機能があります:
trans_table :: [Char] -> [Char] -> Map.Map Char Char
trans_table s1 s2 = Map.fromList (zip s1 s2)
random_trans_table :: IO (Map.Map Char Char)
random_trans_table = do
rawKey <- shuffle ascii
let zipped = zip ascii rawKey
let map = Map.fromList zipped
return map
まず、2 つの文字列から Map を作成します。2 つ目は、ランダム マップを生成します。最初のものは Map.Map Char Char を返します。2 つ目は IO (Map.Map Char Char) を返します
ここで、このマップから値を検索する必要があり、IO マップ用とマップ用の 2 つの関数を作成しました。
translate_char :: Map.Map Char Char -> Char -> Maybe Char
translate_char table c = Map.lookup c table
translate_char_io :: IO (Map.Map Char Char) -> Char -> IO (Maybe Char)
translate_char_io table c = do
raw_table <- table
let result = Map.lookup c raw_table
return result
コードの重複を引き起こすので、私はそれが好きではありません。既に 1 つの関数を複製しています。この方法でコーディングすると、すべての関数を複製する必要があります。
Map と IO (Map) で同じように機能する関数を作成する方法はありますか?