如何将整数列表[1,2,3]转换为字符串" 123"
很抱歉要问明显,但我似乎无法在其他地方找到答案。
答案 0 :(得分:10)
最好的方法是使用show
和concatMap
,这只是concat
和map
的组合:
> concatMap show [1, 2, 3]
"123"
这也适用于包含多个数字的数字:
> concatMap show [10, 20, 30]
"102030"
从type String = [Char]
开始,我们可以将其视为列表处理问题。第一部分是将每个数字转换为String
表示,只需使用show
即可。由于我们希望将其应用于数字列表,因此map
是首选工具。最后,我们希望将所有字符串表示形式(Char
表示列表)加入到单个字符串(Char
列表)中,因此concat
是合适的:
> concat $ map show [1, 2, 3]
"123"
每当您看到concat $ map f some_list
时,您始终可以使用预定义的工具concatMap
,因为这正是其定义:
> concatMap show [1, 2, 3]
"123"
正如评论中所指出的,您可以使用foldMap
模块中的Data.Foldable
来概括整个"地图然后结合"功能。 Foldable
类型类基本上只是意味着您可以在其上使用fold
,它也使用Monoid
,这基本上只意味着您可以组合两个元素,例如串联列出或添加数字。或者,您也可以使用列表形成Monad
并使用>>=
运算符
> [1, 2, 3] >>= show
"123"
最后,所有这些操作几乎归结为将函数应用于每个元素,然后使用其他函数将这些结果组合在一起。它是一种非常普遍的模式,可以在很多情况下应用,因此可以对其进行概括。
答案 1 :(得分:1)
或者,您可以使用
map (chr . (ord '0' +)) [1,2,3,4]
如果您的所有整数都是一位数(您需要从chr
导入ord
和Data.Char
)。
这是有效的,因为String
只是Haskell中[Char]
的类型同义词,因此我们所做的只是将列表中的每个Int
映射到相应的Char