是否有任何haskell函数将列表与分隔符连接起来?


131

有没有用分隔符连接列表元素的功能?例如:

> foobar " " ["is","there","such","a","function","?"]
["is there such a function ?"]

感谢您的回复!


13
我知道lmgtfy的答案很不好,但是值得注意的是,在hoogle上搜索“ String-> [String]-> String”会得到您想要的。haskell.org/hoogle
sigfpe 2012年

3
加入空间,您也有unwords
epsilonhalbe '02

1
@sigfpe旁注:如果[String] -> String -> String其他方法没有答案,您将不得不寻找,对吗?
莱·冈萨雷斯

1
@LayGonzález搜索取决于排列。例如,搜索[a] -> (a -> b) -> [b]返回map作为其第一结果。
gallais

Answers:


227

是的,

Prelude> import Data.List
Prelude Data.List> intercalate " " ["is","there","such","a","function","?"]
"is there such a function ?"

intersperse 比较笼统:

Prelude> import Data.List
Prelude Data.List> concat (intersperse " " ["is","there","such","a","function","?"])
"is there such a function ?"

此外,对于要与空格字符连接的特定情况,还有unwords

Prelude> unwords ["is","there","such","a","function","?"]
"is there such a function ?"

unlines其工作原理类似,只是使用换行符将字符串内插,并且将换行符也添加到末尾。(这对于序列化文本文件很有用,根据POSIX标准,文本文件必须以尾随换行符结尾)


可以处理任何空字符串吗?
CMCDragonkai 2015年

3
@CMCDragonkai不确定您确切指的是什么,但是是的,这些函数都允许将任意字符串用作分隔符和元素。例如,intercalate "," ["some", "", "string"] = "some,,string"以及intercalate "" ["foo", "bar"] = "foobar"
Niklas B.

3
unlines在每行中添加一个换行符,即unlines ["A", "B"] = "A\nB\n",因此它与插入不一样。
凯西·范·斯通

@KathyVanStone有趣的是,我猜我从未尝试过,只是认为它的工作方式类似于unwords
Niklas B.

1
很高兴在标准库中有一些普通的字符串和列表操作函数,并且很高兴在这里发布一个示例,因为在Haskell中很难找到此类日常编程的任何文档。
Andrew Koster


3
joinBy sep cont = drop (length sep) $ concat $ map (\w -> sep ++ w) cont

3

如果有人感兴趣,还可以使用一些其他的想法实现插入和插入:

myIntersperse :: a -> [a] -> [a]
myIntersperse _ [] = []
myIntersperse e xs = init $ xs >>= (:[e])

myIntercalate :: [a] -> [[a]] -> [a]
myIntercalate e xs = concat $ myIntersperse e xs

xs >>= f等同于concat (map f xs)


2

如果您想编写自己的intercalate和版本intersperse

intercalate :: [a] -> [[a]] -> [a]
intercalate s [] = []
intercalate s [x] = x
intercalate s (x:xs) = x ++ s ++ (intercalate s xs)

intersperse :: a -> [a] -> [a]
intersperse s [] = []
intersperse s [x] = [x]
intersperse s (x:xs) = x : s : (intersperse s xs)

1
为什么限制自己使用字符串?同样,您在函数应用程序周围的多余部分也是多余的。
melpomene

是的,intersperse不一定要是Strings,但intercalate至少需要是Show,并且如果您确实使用过Show,则String无论如何都需要使用某种方法来处理它们。我仍然习惯于Haskell如何处理混合的infix和前缀函数/运算符,并且我更喜欢在混合时使用方括号,以防万一我最终想要使用$
Zoey Hewll

intercalate :: [a] -> [[a]] -> [a]-为什么Show?至于语法,Haskell没有任何前缀运营商(除-,这是可憎的),以及功能应用的优先级比任何管道符更紧:x:s:intersperse s xs是罚款(但它读取好得多,如果你把空格:x : s : intersperse s xs(我不不太了解为什么人们喜欢忽略周围的空间:))。
melpomene

对。我一直忘记使用字符串只是在使用列表。Show是因为我假设你希望结果是一个String。“前缀和前缀函数/运算符”的意思是“前缀函数和前缀运算符”,但这尚不清楚。一元-是死亡。至于:s和其他中缀运算符,是否使用空格在很大程度上取决于上下文,但是我始终保持本地一致性。例如,(:)在模式匹配中永远不会有空格,但是在其他地方,它取决于是否用括号括起来以及我的心情。
Zoey Hewll'2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.