我正在寻找实现拆分功能的简单方式。这就是我所拥有的:
import Data.List
groupBy (\x y -> y /= ',') "aaa, bbb, ccc, ddd"
=> ["aaa",", bbb",", ccc",", ddd"]
这几乎是我想要的,除了分隔符","结果集中甚至还有一个额外的空格。我希望它是["aaa","bbb","ccc","ddd"]
那么最简单的方法是什么?
答案 0 :(得分:5)
想一想:你的小组分隔符是什么?
在你的情况下,看起来你想避免使用逗号和空格,为什么不呢?
split :: Eq a => [a] -> [a] -> [[a]]
split separators seq = ...
你可以分组然后写
groupBy ((==) `on` (flip elem sep)) seq
取
[ "aaa"
, ", "
, "bbb"
, ", "
, "ccc"
, ", "
, "ddd"
]
并过滤最终有效组
filter (not.flip elem sep.head) $ groupBy ((==) `on` (flip elem sep)) seq
返回
["aaa","bbb","ccc","ddd"]
当然,如果你想要一个已实现的功能,那么Data.List.Split就太棒了!
说明的
此split
函数适用于任何a
类型,只要实例Eq
类(即您可以比较给定两个a
的相等性)。不只是Char
。
Haskell中的一个(基于列表的)字符串写为[Char]
,但一个字符列表(不是字符串)也写为{ {1}}。
在我们的[Char]
函数中,第一个元素列表是有效的分隔符(例如,split
可能是[Char]
),第二个元素列表是要拆分的源列表(例如, ", "
可能是[Char]
)。更好的签名可能是:
"aaa, bbb"
或type Separators a = [a]
split :: Eq a => Separators a -> [a] -> [[a]]
/ data
变体,但这是另一个故事。
然后,我们的第一个参数与第二个参数的类型相同 - 但它们不是一回事。
结果类型是字符串列表。由于字符串为newtype
,因此结果类型为[Char]
。如果我们更喜欢一般类型(不仅仅是[[Char]]
),那么它会变成Char
。
使用数字拆分的示例可能是:
[[a]]
Prelude> split [5,10,15] [1..20]
[[1,2,3,4],[6,7,8,9],[11,12,13,14],[16,17,18,19,20]]
是分隔符列表,[5,10,15]
要分割的输入列表。
(非常感谢Nick B!)
答案 1 :(得分:5)
查看Data.List.Split包中的splitOn
函数:
splitOn ", " "aaa, bbb, ccc, ddd" -- returns ["aaa","bbb","ccc","ddd"]
它在完整子字符串的每次出现时拆分给定列表。或者,您也可以使用splitOneOf
:
splitOneOf ", " "aaa, bbb, ccc, ddd" -- returns ["aaa","","bbb","","ccc","","ddd"]
虽然它返回一些空字符串,但它具有分割其中一个字符的优点。可以通过简单的filter
删除空字符串。