【问题标题】:How to fix a list to character matching error in Haskell?如何修复 Haskell 中的字符匹配错误列表?
【发布时间】: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 CharJust x,在没有匹配时返回 Nothing
  • 不过,通过列表,您可以检查它是否为空(在这种情况下您返回a)或不是(在这种情况下您返回它的第一个元素)。
  • 使用答案中的列表推导函数lookup,只需调用head (lookup a xs ++ [a])即可。

标签: haskell error-handling


【解决方案1】:

使用 list comprehension 您可以返回一个 list 项目。如果您因此将其实现为:

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

您将检索Characters (a String) 的列表,其中包含 2 元组的第二项 c,给定第一项 b 的那 2 -tuple 匹配查询a

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

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

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

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

【讨论】:

  • 好吧,我会尽力的。 query = go part 是什么意思?
  • @idontknowhowtocode: query 是第一个参数,所以它是我们要查找的值。 go 是一个辅助函数,它将 2 元组列表作为参数。这样可以避免在每个递归调用中传递query
  • 对了,还有xa和xb这部分,是不是和xs很像?
  • @idontknowhowtocode:xaxb 分别是列表的第一个 2 元组的第一项和第二项,而 xs 是其余 2 元组的列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 2021-08-21
  • 2020-08-06
相关资源
最近更新 更多