F#では2つのシーケンスがそれぞれ厳密に昇順に並べられています。listMaxes
とnumbers
です。F#のシーケンスを慣用的な方法で別のシーケンスに基づいて分割する方法
not Seq.isEmpty numbers
の場合、not Seq.isEmpty listMaxes
とSeq.last listMaxes >= Seq.last numbers
が保証されます。
IはlistMaxes
限界の場合の要素、リストに分割numbers
の要素を含む、F#でList.length
Seq.length listMaxes
に等しい整数のリストのリストを返す関数を実装するために、各グループにたいです。例えば
:この関数は
[ [10; 11; 13; 16; 20; 25]; [31; 38; 46; 55]; [65]; List.empty; [76; 88] ]
を返す必要があります
listMaxes = seq [ 25; 56; 65; 75; 88 ]
numbers = seq [ 10; 11; 13; 16; 20; 25; 31; 38; 46; 55; 65; 76; 88 ]
引数で呼び出さ私は一度だけnumbers
を反復、この機能を実装することができます
let groupByListMaxes listMaxes numbers =
if Seq.isEmpty numbers then
List.replicate (Seq.length listMaxes) List.empty
else
List.ofSeq (seq {
use nbe = numbers.GetEnumerator()
ignore (nbe.MoveNext())
for lmax in listMaxes do
yield List.ofSeq (seq {
if nbe.Current <= lmax then
yield nbe.Current
while nbe.MoveNext() && nbe.Current <= lmax do
yield nbe.Current
})
})
しかし、これをコードは汚れていて、醜く、命令的で、非常にun-F#-yと感じます。
これを実現する機能/ F#自主的な方法はありますか?
機能は、実行時エラーを生成します。 – Matiasd
正しい観察。 [私自身の答え]から最後の3行(http://stackoverflow.com/questions/43101240/how-to-split-a-sequence-in-f-based-on-another-sequence-in-an-idiomatic -way/43104501#43104501) '余分な'行を追加するには、ここでも正しい必要があります。 – user7787630