"分流"返回冗余字符

时间:2014-07-10 09:51:04

标签: haskell

我正在寻找实现拆分功能的简单方式。这就是我所拥有的:

import Data.List
groupBy (\x y -> y /= ',') "aaa, bbb, ccc, ddd"

=> ["aaa",", bbb",", ccc",", ddd"]

这几乎是我想要的,除了分隔符","结果集中甚至还有一个额外的空格。我希望它是["aaa","bbb","ccc","ddd"]

那么最简单的方法是什么?

2 个答案:

答案 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删除空字符串。