F# 中的分割序列
我应该通过元素的属性将 seq
拆分为 seq
。如果此属性等于给定值,则必须在该点“拆分”。我怎样才能在FSharp中做到这一点?
最好将一个“函数”传递给它,如果必须在该项目上拆分或不拆分,则返回一个布尔值。
样本:
输入序列:seq: {1,2,3,4,1,5,6,7,1,9}
当它等于 1 时,应该在每个项目上进行拆分,因此结果应该是:
seq
{
seq{1,2,3,4}
seq{1,5,6,7}
seq{1,9}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您真正要做的就是分组——每次遇到值时创建一个新组。
例子
再次,更短,斯蒂芬的很好的改进:
All you're really doing is grouping--creating a new group each time a value is encountered.
Example
Again, shorter, with Stephen's nice improvements:
不幸的是,编写使用序列(
seq<'T>
类型)的函数有点困难。它们不能很好地处理功能概念,例如列表上的模式匹配。相反,您必须使用GetEnumerator
方法和生成的IEnumerator<'T>
类型。这通常会使代码变得非常命令式。在这种情况下,我会写以下内容:我不建议使用函数式风格(例如使用
Seq.skip
和Seq.head
),因为这相当效率低下 - 它创建一个序列链,从其他序列中获取值并返回它(因此通常有 O(N^2) 复杂度)。或者,您可以使用计算生成器来编写此代码以与
IEnumerator<'T>
一起使用,但这不是标准的。如果您想使用它,可以在这里找到它。Unfortunately, writing functions that work with sequences (the
seq<'T>
type) is a bit difficult. They do not nicely work with functional concepts like pattern matching on lists. Instead, you have to use theGetEnumerator
method and the resultingIEnumerator<'T>
type. This often makes the code quite imperative. In this case, I'd write the following:I wouldn't recommend using the functional style (e.g. using
Seq.skip
andSeq.head
), because this is quite inefficient - it creates a chain of sequences that take value from other sequence and just return it (so there is usually O(N^2) complexity).Alternatively, you could write this using a computation builder for working with
IEnumerator<'T>
, but that's not standard. You can find it here, if you want to play with it.以下是一个不纯粹的实现,但会惰性地产生不可变序列:
f
是用于测试元素是否应该是分割点的函数:The following is an impure implementation but yields immutable sequences lazily:
f
is the function used to test whether an element should be a split point:可能不是最有效的解决方案,但这可行:
splitOn 的类型是 ('a -> bool) -> seq<'a> ->序列>。我还没有在很多输入上测试过它,但它似乎有效。
Probably no the most efficient solution, but this works:
The type of splitOn is ('a -> bool) -> seq<'a> -> seq>. I haven't tested it on many inputs, but it seems to work.
如果您正在寻找实际上像 split 作为字符串拆分一样工作的东西(即不包含谓词返回 true 的项目),下面是我想到的..尝试尽可能实用:)
In case you are looking for something which actually works like split as an string split (i.e the item is not included on which the predicate returns true) the below is what I came up with.. tried to be as functional as possible :)