我有两个功能:
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
首先他们从两个字符串创建 Map;第二个生成随机地图。第一个返回 Map.Map Char Char;第二个返回 IO (Map.Map Char Char)
现在我需要从这个 Map 中查找值,并且我创建了两个函数 - 一个用于 IO Map,另一个用于 Map:
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
我不喜欢它,因为它会导致代码重复。我已经复制了一个函数,如果我用这种方式编码,我将需要复制我的所有函数。
有没有一种方法可以创建与 Map 和 IO (Map) 一起使用的函数?