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

Haskell - how to convert [1,2,3] to "123"

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

抱歉问了一些显而易见的问题,但我似乎无法在其他地方找到答案。

最好的方法是使用 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"

正如评论中所指出的,您可以使用 Data.Foldable 模块中的 foldMap,该模块概括了整个 "map then combine" 功能。 Foldable 类型类基本上只是意味着你可以在它上面使用 folds,它也使用 Monoid,这基本上只是意味着你有一种方法来组合两个元素,例如串联列表或添加数字。或者,您也可以使用列表形成 Monad 的事实,并将 >>= 运算符用作

> [1, 2, 3] >>= show
"123"

最后,所有这些操作几乎都归结为对每个元素应用一个函数,然后使用其他函数将这些结果组合在一起。这是一个非常通用的模式,可以在很多情况下应用,因此为什么要对它进行概括。

或者,您可以使用

map (chr . (ord '0' +)) [1,2,3,4]

如果您的所有整数都是个位数(您需要从 Data.Char 导入 chrord)。

这是可行的,因为 String 只是 Haskell 中 [Char] 的类型同义词,所以我们所做的只是将列表中的每个 Int 映射到合适的Char.