【发布时间】:2021-10-09 22:15:37
【问题描述】:
我正在尝试编写一个函数,该函数通过匹配其第一个组件来找到一对并返回该对的第二个组件。当尝试查找未出现在密码密钥中的字符时,该函数应使其保持不变。例子:
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 ]
当我尝试运行它时,它会产生一个列表和字符不匹配错误。我该如何解决这个问题?
【问题讨论】:
-
您不想构建结果列表。无论
b == a与否,您都想返回单个字符。有一个内置的lookup函数可以使用:它在找到匹配时返回Maybe Char:Just x,在没有匹配时返回Nothing。 -
不过,通过列表,您可以检查它是否为空(在这种情况下您返回
a)或不是(在这种情况下您返回它的第一个元素)。 -
使用答案中的列表推导函数
lookup,只需调用head (lookup a xs ++ [a])即可。