0

値を生成するループを書く以外に、シーケンス内でラグ (前の値) を作成するシンプルでクリーンな機能的な方法はありますか。

例えば。私のシーケンスが1 2 3 4 5 6 7 8 9 10あり、ラグがある場合1、タプルを返します

(Some(1), None), (Some(2), Some(1)), (Some(3), Some(2))...(Some(10), Some(9))

の遅れ2は与えるだろう(Some(1), None), (Some(2), None), (Some(3), Some(1))...

ループを使ってこれを書くのは明らかに簡単ですが、それは正しい方法ですか?

4

2 に答える 2

3

1 つの方法は、Seq モジュールの関数を使用することです。

let lag n sequence =
    sequence
    |> Seq.map Some
    |> Seq.append (Seq.init n (fun _ -> None))
    |> Seq.zip sequence

lag 2 [1..5] |> Seq.toList
> [(1, null); (2, null); (3, Some 1); (4, Some 2); (5, Some 3)]
于 2013-02-28T15:40:23.617 に答える
1

petebu の回答 (いくつかの間違いが修正されると) がより良い回答です。しかし、とにかくここに残します。

let withLag n (source: seq<_>) =
  source
    |> Seq.windowed n
    |> Seq.append (Seq.init n (fun _ -> [||]))
    |> Seq.zip source
    |> Seq.map (fun (x, arr) ->
      let laggedValue = if arr.Length > 0 then Some arr.[0] else None
      (x, laggedValue))

let l = List.init 5 id
l |> withLag 2 |> Seq.toList |> printfn "%A"

> [(0, null); (1, null); (2, Some 0); (3, Some 1); (4, Some 2)]
于 2013-02-28T15:39:53.990 に答える