我在hubFS上发现了这个问题,但它根据各个元素处理分裂标准.我想根据相邻元素的比较进行拆分,因此类型如下所示:
val split = ('T -> 'T -> bool) -> 'T list -> 'T list list
Run Code Online (Sandbox Code Playgroud)
目前,我试图从Don的必要解决方案开始,但我无法弄清楚如何初始化和使用'prev'值进行比较.折叠更好的方式去?
//Don's solution for single criteria, copied from hubFS
let SequencesStartingWith n (s:seq<_>) =
seq { use ie = s.GetEnumerator()
let acc = new ResizeArray<_>()
while ie.MoveNext() do
let x = ie.Current
if x = n && acc.Count > 0 then
yield ResizeArray.to_list acc
acc.Clear()
acc.Add x
if acc.Count > 0 then
yield ResizeArray.to_list acc }
Run Code Online (Sandbox Code Playgroud) 我应该分割seq<a>成seq<seq<a>>由所述元件的一个属性.如果此属性等于给定值,则必须在该点处"拆分".我怎么能在FSharp中做到这一点?
如果必须在该项目中进行拆分,则将"函数"传递给它并返回bool应该是不错的.
示例:输入序列: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}
}
Run Code Online (Sandbox Code Playgroud) 在F#中,假设我们有一个字节数组,表示按RGB顺序每像素三个字节的像素数据:
[| 255; 0; 0; //Solid red
0; 255; 0; //Solid green
0; 0; 255; //Solid blue
1; 72; 9;
34; 15; 155
... |]
Run Code Online (Sandbox Code Playgroud)
我很难知道如何按原样对这些数据进行功能操作,因为单个项目实际上是数组中三个元素的连续块.
所以,我需要首先将数组中的三元组分组为:
[|
[| 255; 0; 0 |];
[| 0; 255; 0 |];
[| 0; 0; 255 |];
[| 1; 72; 9 |];
[| 34; 15; 155 |]
... |]
Run Code Online (Sandbox Code Playgroud)
现在,将三元组收集到子数组中很容易用for循环,但我很好奇 - 有没有一种功能方法来收集F#中的数组元素组?我的最终目标不仅仅是如上所述转换数据,而是以更具声明性和功能性的方式解决问题.但我还没有找到一个如何在没有命令性循环的情况下做到这一点的例子.