将 char 添加到列表中的每个元组的第二个元素

Posted

技术标签:

【中文标题】将 char 添加到列表中的每个元组的第二个元素【英文标题】:add char to every tuple second element in list 【发布时间】:2022-01-05 00:53:39 【问题描述】:
getNames 'A' [('A', "Smith"), ('J', "Brown")] -> ["A.Smith", "A.Brown"]

我尝试将 char 添加到列表中的每个字符串元素。我的代码是:

addForEvery :: Char -> [String] -> [String]
addForEvery a (x:xs) = [a] ++ x : addForEvery a xs
print(addForEvery 'a' ["fa"])

但我收到以下错误:

jdoodle.hs:6:32: error:
    • Couldn't match type ‘[Char]’ with ‘Char’
      Expected type: [Char]
        Actual type: [String]
    • In the second argument of ‘(++)’, namely ‘x : addForEvery a xs’
      In the expression: [a] ++ x : addForEvery a xs
      In the expression: [[a] ++ x : addForEvery a xs]
  |
6 | addForEvery a (x:xs) = [[a] ++ x : addForEvery a xs]
  |                                ^^^^^^^^^^^^^^^^^^^^

【问题讨论】:

在你的例子中,"Smith"如何变成"Taylor" 签名已经不一致:在您的示例中,第二个参数是对列表,但在您的签名addForEvery :: Char -> [String] -> [String] 中,第二个参数是字符串列表。 【参考方案1】:

问题是[a] ++ x : addForEvery a xs 被解释为[a] ++ (x : addForEvery a xs)。这没有多大意义,因为[a]String,它需要x : addForEvery a xs,但这是Strings 的列表。

您可以使用map :: (a -> b) -> [a] -> [b] 将相同的功能应用于列表中的所有项目。因此,我们可以将其实现为:

getNames :: [(Char, String)] -> [String]
getNames = map toFullName
    where toFullName fn ln = fn : '.' : ln

【讨论】:

【参考方案2】:

做到了!

getNames :: Char -> [(Char, String)] -> [String]
getNames a [] = []
getNames a ((z, b):xs) = ([a] ++ ['.'] ++ b) : getNames a xs

【讨论】:

(a : '.' : b) 而不是[a] ++ ['.'] ++ b

以上是关于将 char 添加到列表中的每个元组的第二个元素的主要内容,如果未能解决你的问题,请参考以下文章

如何提取每个子列表中每个元组的第一个元素?

按元组的第二个元素对元组列表进行排序,无需高阶函数或递归

如何将元组的所有第一个元素与同一元组中相应的第二个元素进行比较

如何使用元组绘制列表[重复]

Python元组列表将第二个元素与唯一的第一个元素合并

python中的list元组如何按照第二维元素排序