如何修复 Haskell 中的字符匹配错误列表?

How to fix a list to character matching error in Haskell?

我正在尝试编写一个函数,通过匹配其第一个组件和 returns 该对的第二个组件来找到一对。当一个人试图查找一个没有出现在密码密钥中的字符时,函数应该保持它不变。示例:

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 ]

当我尝试 运行 它时,它会产生列表和字符不匹配错误。我该如何解决这个问题?

通过列表理解,您return 一个列表 项。如果您因此将其实现为:

lookUp :: Char -> [(Char, Char)] -> <strong>[Char]</strong>
lookUp a xs = [ c | (b,c) <- xs, b == a ]

您将检索 列表Char 个角色(一个 String),其中包含二元组的第二项 c ,给定该 2 元组的第一项 b 与查询 a.

匹配

但是您不想检索列表,而只想检索第一个匹配项,或者给定的相同项不在二元组列表中。

我们可以通过递归来实现这一点,例如我们枚举列表的元素,如果我们找到给定的项目,我们 return 第二个项目。如果找不到以我们正在寻找的项目作为第一项的 2 元组,我们 return 我们正在寻找的项目:

lookUp :: Eq a => a -> [(a, a)] -> a
lookUp query = go
    where go [] = …  -- (1)
          go ((xa, xb) : xs)
              | query = xa = …  -- (2)
              | otherwise = …  -- (3)

需要填写部分的地方。对于第三种情况,您需要在列表的尾部 xs 进行递归。