如何为列表中的每个项添加char?

时间:2017-12-24 20:57:03

标签: haskell functional-programming

作为练习,看看我是否理解sprintf函数,我想在A-Z范围内的每个项目中添加一个字符'a'。

很明显,我不会因为我得到这些例外情况而不是输出:

map

我理解++是包含字符串的列表的concat运算符。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:8)

正如您所说++是列表的concat运算符。它需要一个列表,并在末尾添加另一个列表,例如[1, 2, 3] ++ [4, 5, 6] == [1,2,3,4,5,6]。在您的情况下,问题是您正在尝试向字符添加字符 - 而不是列表中的列表。

字符串是一个字符列表,所以我们可以这样做:

map (\x -> [x] ++ ['A']) ['A'..'Z']

然而,这有点麻烦和丑陋。如果我们只想在列表的开头添加一个项目,我们可以使用:运算符。通过这种方式,我们可以解决问题。我们可以将字符添加到“A”的开头,而不是在每个字符的末尾添加“A”。

例如:

map (\x -> x : "A") ['A'..'Z']

然后我们可以将ETA减少为:

map (: "A") ['A'..'Z']

您可能已经注意到,我已将“A”替换为“A”。 “A”是一个字符列表,恰好是一个元素长。现在,我们可以在列表中添加一个字符,即输入,而不必先将两个字符都转换为列表。

我们可以看到,它按预期工作:

Prelude> map (: "A") ['A'..'Z']
["AA","BA","CA","DA","EA","FA","GA","HA","IA","JA","KA","LA","MA","NA","OA","PA","QA","RA","SA","TA","UA","VA","WA","XA","YA","ZA"]