将 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
,但这是String
s 的列表。
您可以使用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 添加到列表中的每个元组的第二个元素的主要内容,如果未能解决你的问题,请参考以下文章