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"]