2012-10-27 168 views
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」函數返回的地圖,其中一個字符映射到另一個地圖。 我可以創建函數來得到一個字符,並返回基於此地圖另一個問題:

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必須只有一個參數。我需要像全局變量一樣來存儲地圖,並在我的地圖功能中查找它的值。但我不知道如何重寫我的代碼。

p.s.我想我可以在我的字符串中爲每個字符添加'key',但我正在尋找常用的解決方案。

+0

什麼是你的編碼功能的關鍵? – Satvik

+0

Hm ...這是'translate_char'函數中的'n'參數。 – demas

+0

然後我提供的答案應該工作得很好。 – Satvik

回答

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

+0

謝謝。這是我正在尋找的解決方案。 – demas