Haskell字符串列表扁平化

4

我希望能够将字符串列表展平,但有额外的要求。例如:

[["My","Name","is"],["John","Doe"]]

输出结果应为:

My name is \nJohn Doe

我尝试使用concat函数,但仍然没有成功。

谢谢。

3个回答

7

此外,如果您想要/可以容忍在末尾添加额外的 "\n",您可以将 intercalate "\n" 替换为 unlines - Antal Spector-Zabusky

6
你要找的函数叫做intercalate,它存在于Data.List中。你需要使用它两次,第一次在内部列表的每个单词之间添加一个空格,然后再次在外部列表之间添加\nfmap是你的好朋友。

5
unlines 可以作为 intercalate "\n" 的替代方案,值得一提。 - bradrn
2
@bradm:unlines会在末尾添加一个额外的'\n'。虽然这本身并不是问题。 - Willem Van Onsem

3

结合@John F Miller的答案,您只需要进行插入和添加所需元素,并使用concatMap:

import Data.List

ls = [["My","Name","is"],["John","Doe"]]

rs = concatMap (intercalate " ") (insertAt 1 ["\n"] ls)

insertAt _ _ []     = []
insertAt 0 e xs     = e:xs
insertAt n e (x:xs) = x : (insertAt (n-1) e xs)


main = do
  putStrLn rs

$> My Name is
   John Doe

另一种方法是@luqui提出的评论,但我认为应该考虑:

rs = intercalate " " . intercalate ["\n"] $ ls

这个 intercalate "\n" . map (intercalate " ") 怎么样? - luqui
@luqui 听起来很不错,有了这个想法,我更新了答案,忘记提到你了,抱歉。 - developer_hatch

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