如何修复 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
进行递归。
我正在尝试编写一个函数,通过匹配其第一个组件和 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
进行递归。