我有兩個功能:如何避免重複的功能(IO而不是-IO版本)
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 Char Char;第二個返回IO(Map.Map字符字符)
現在我需要從這個地圖查找價值,我已經創建了兩個功能 - 一個用於IO地圖和一個用於地圖:
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)一起工作?
你幾乎從來沒有想寫採取'IO Something'作爲輸入,除非你正在寫某種控制結構這就需要如果/當/動作運行多少次控制功能。如果你只需要一個值,你應該讓你的函數只取一個值,並在調用站點使用'do'-notation,'>> ='或類似的方法來綁定第一個動作的結果並將其傳遞給第二個。 – hammar