Haskell - 如何将[1,2,3]转换为" 123"

时间:2015-02-19 16:33:14

标签: haskell

如何将整数列表[1,2,3]转换为字符串" 123"

很抱歉要问明显,但我似乎无法在其他地方找到答案。

2 个答案:

答案 0 :(得分:10)

最好的方法是使用showconcatMap,这只是concatmap的组合:

> 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导入ordData.Char)。

这是有效的,因为String只是Haskell中[Char]的类型同义词,因此我们所做的只是将列表中的每个Int映射到相应的Char