14

List.skipとList.takeがないのはなぜですか?もちろんSeq.takeとSeq.skipはありますが、結果としてリストは作成されません。

考えられる解決策の1つは、mylist |> Seq.skip N |> Seq.toListです。ただし、これにより、最初の列挙子が作成され、次にその列挙子から新しいリストが作成されます。不変リストから不変リストを作成するもっと直接的な方法があると思います。内部には要素のコピーがないため、新しいリストから元のリストへの参照のみがあります。

(例外をスローせずに)他の可能な解決策は次のとおりです。

let rec listSkip n xs = 
    match (n, xs) with
    | 0, _ -> xs
    | _, [] -> []
    | n, _::xs -> listSkip (n-1) xs

しかし、これはまだ質問に答えていません...

4

2 に答える 2

12

ところで、関数を List モジュールに追加できます。

module List =
   let rec skip n xs = 
      match (n, xs) with
      | 0, _ -> xs
      | _, [] -> []
      | n, _::xs -> skip (n-1) xs
于 2010-12-02T13:47:29.613 に答える
11

志望者List.skip 1は と呼ばれ、リストにnList.tailだけ入ることができます。tail

List.take不変リストの共通サフィックスのみを共有できるため、とにかく新しいリストを作成する必要があります。

于 2010-12-02T16:41:34.417 に答える