将一个字符串列表连接成一个字符串(Haskell)

5
我有一个字符串列表(见下文),如何将这些字符串连接成一个包含一个字符串的列表。

我有一个字符串列表(见下文),如何将这些字符串连接成一个包含一个字符串的列表。

["hello","stack","overflow"] 

转换成

["hellostackoverflow"]

我只能导入Data.Char和Data.List这两个模块。


你想要的结果是一个字符串还是包含一个字符串的列表? - Lee
concat - 如果你想要它作为一个列表,使用 return . concat(如果你在 GHCi 中尝试的话,不要忘记类型注释:return . concat $ ["hello","stack","overflow"] :: [String] - Random Dev
@Lee 我的意思是一个包含一个字符串的列表。 谢谢,它起作用了。将其发布为答案,以便我可以接受它:D。 - Memphis
1
@downvoter,你能解释一下我如何改进这个问题吗? - Memphis
4
我们进行负投票是因为你没有表明自己为解决问题所做的努力,并且这个问题不足够有趣以激发我们的兴趣。 - dfeuer
将结果重新包装成列表有点奇怪,因为它会丢失只有一个结果字符串的信息。 - dfeuer
3个回答

13

将列表中的每个字符串视为字符列表

["hello","stack","overflow"] :: [[Char]]

连接是将多个列表连接成一个的过程。其必须有以下类型:

concat :: [[a]] -> [a]

如果你有这样一个功能,那么你已经完成了一半的工作。你正在寻找一种方法来获得

["hellostackoverflow"]

由于连接的结果。再次查看它的类型:

["hellostackoverflow"] :: [[Char]]

这是与您一开始所拥有的类型相同,只不过列表中只有一个元素。现在,您需要一个能将东西放入列表中的函数,它必须拥有一个类型。

putToList :: a -> [a]

一旦你有了 concatputToList 函数,你的解决方案就几乎完成了。最后需要做的事情就是像这样组合它:

Once you'll have both concat and putToList functions, your solution will be almost ready. Last thing you need to do is to compose it like that:

myConcatenation = putToList . concat

我建议您使用Hoogle按类型搜索现有函数。


@Kwarrtz 这个太底层了。最好使用purereturn - user2556165
1
在这里使用“低级”函数会有什么不利之处? - Kwarrtz
@Kwarrtz 不确定为什么我当时说它太低级了。我可能在某个地方读到过关于列表的内容,以及必须避免使用它们的原始函数而选择通用代码的内容。我认为两种解决方案在教育目的上都是可以的。无论如何,我会选择 pure,因为我懒得写 (:[])。此外,它是一个定义良好的名称。一旦我过一段时间回到代码中,我就不需要考虑它的作用是什么。抱歉回答晚了 :) - user2556165

6
concat ["hello","stack","overflow"] -- => "hellostackoverflow"

2

您也可以使用列表单子来将列表缩减为单个字符串,然后重新将结果包装在一个列表中。

> [["hello", "stack", "overflow"] >>= id]
["hellostackoverflow"]

上述代码避免了显式使用Control.Monad.join

> import Control.Monad
> [join ["hello", "stack", "overflow"]
["hellostackoverflow"]

2
xs >>= idjoin xs 等同于 concat xs。为什么要不必要地使一个简单的操作变得复杂呢? - Kwarrtz
@Kwarrtz 这个答案展示了如何使用 [] 的单子属性来实现目标,而不是让它变得更加复杂。 - user2556165

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接