我正在嘗試撰寫一個函式,該函式通過匹配其第一個組件來找到一對并回傳該對的第二個組件。當試圖查找密碼密鑰中沒有出現的字符時,函式應該保持它不變。例子:
ghci> lookUp 'B' [('A','F'), ('B','G'), ('C','H')]
'G'
ghci> lookUp '9' [('A','F'), ('B','G'), ('C','H')]
'9'
我有一個我不確定是否有幫助的密鑰,但它是:
alphabet = ['A'..'Z']
makeKey :: Int -> [(Char, Char)]
makeKey k = zip alphabet (rotate k alphabet)
輸出是這樣的:
ghci> makeKey 5
[('A','F'),('B','G'),('C','H'),('D','I'),('E','J'),('F','K'),
('G','L'),('H','M'),('I','N'),('J','O'),('K','P'),('L','Q'),
('M','R'),('N','S'),('O','T'),('P','U'),('Q','V'),('R','W'),
('S','X'),('T','Y'),('U','Z'),('V','A'),('W','B'),('X','C'),
('Y','D'),('Z','E')]
到目前為止,這是我的代碼:
lookUp :: Char -> [(Char, Char)] -> Char
lookUp a xs = [ c | (b,c) <- xs, b == a ]
當我嘗試運行它時,它會產生一個串列和字符不匹配錯誤。我該如何解決?
uj5u.com熱心網友回復:
通過串列理解,您可以回傳一個專案串列。如果您因此將其實作為:
lookUp :: Char -> [(Char, Char)] -> [Char]
lookUp a xs = [ c | (b,c) <- xs, b == a ]
假設該 2 元組的第一項與查詢匹配,您將檢索包含2 元組的第二項的演員串列Char(a String) 。cba
但是您不想檢索串列,而只想檢索第一個匹配項,或者給定該專案的相同專案不在 2 元組串列中。
例如,我們可以通過遞回來實作這一點,其中我們列舉串列的元素,如果找到給定的專案,則回傳第二個專案。如果找不到二元組作為我們正在尋找的專案的第一項,我們將回傳我們正在尋找的專案:
lookUp :: Eq a => a -> [(a, a)] -> a
lookUp query = go
where go [] = … -- (1)
go ((xa, xb) : xs)
| query = xa = … -- (2)
| otherwise = … -- (3)
你需要填寫的…部分。對于第三種情況,您需要xs在串列的尾部進行遞回。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316826.html
