Haskell &引用;“拆分”;返回冗余字符

Haskell &引用;“拆分”;返回冗余字符,haskell,Haskell,我正在寻找一种实现拆分功能的简单方法。以下是我所拥有的: import Data.List groupBy (\x y -> y /= ',') "aaa, bbb, ccc, ddd" => ["aaa",", bbb",", ccc",", ddd"] 这几乎就是我想要的,除了结果集中有一个分隔符“,”甚至一个额外的空格。我希望它是[“aaa”、“bbb”、“ccc”、“ddd”] 那么最简单的方法是什么呢?想想:你的分组分隔符是什么 在您的情况下,您希望避免逗号和空格,为什

我正在寻找一种实现拆分功能的简单方法。以下是我所拥有的:

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

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

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

想想:你的分组分隔符是什么

在您的情况下,您希望避免逗号和空格,为什么不呢

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"]
当然,如果你想实现一个功能,那就太好了

解释

每当实例
Eq
类时,此
split
函数适用于任何
a
类型(即,您可以比较给定两个
a
的等式)。不仅仅是
Char

Haskell中的(基于列表的)字符串写为
[Char]
但是字符列表(不是字符串)也写为
[Char]

在我们的
split
函数中,第一个元素列表是有效的分隔符(例如对于
[Char]
可能是
,“
),第二个元素列表是要拆分的源列表(例如对于
[Char]
可能是
“aaa,bbb”
)。更好的签名可以是:

type Separators a = [a]

split :: Eq a => Separators a -> [a] -> [[a]]
或者
数据
/
新类型
变体,但这是另一个故事

然后,我们的第一个参数与第二个参数的类型相同,但它们不是同一件事

结果类型是字符串列表。由于字符串是
[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]
是分隔符列表,
[1..20]
是要拆分的输入列表


(非常感谢Nick B!)

看看软件包中的
splitOn
功能:

它会在每次出现完整的子字符串时拆分给定的列表。或者,您也可以使用
splitOneOf

splitOneOf ", " "aaa, bbb, ccc, ddd" -- returns ["aaa","","bbb","","ccc","","ddd"]

虽然它返回一些空字符串,但它有在其中一个字符处拆分的优点。空字符串可以通过一个简单的
过滤器删除

我实际上不明白为什么“split”得到[a]和[a],而不是[a]和a。并返回[[a]],而不仅仅是[a]。Alexander Supertramp:想象一下,您想要拆分字符串“一::二::三::四”on:::::::。然后,分隔符的类型为
[Char]
,而不是
Char
类型。
splitOneOf ", " "aaa, bbb, ccc, ddd" -- returns ["aaa","","bbb","","ccc","","ddd"]