私はF#で遊び始めたばかりなので、この質問はおそらくかなり基本的なものになるでしょう...
テキストファイルを1行ずつ読み取り、最初の行を無視して、特定の関数を使用して他の行を処理したいと思います。だから私は次のようなものを使うことを考えていました:
File.ReadAllLines(path)
|> Array.(ignore first element)
|> Array.map processLine
それを達成するためのエレガントでありながら効率的な方法は何でしょうか?
私はF#で遊び始めたばかりなので、この質問はおそらくかなり基本的なものになるでしょう...
テキストファイルを1行ずつ読み取り、最初の行を無視して、特定の関数を使用して他の行を処理したいと思います。だから私は次のようなものを使うことを考えていました:
File.ReadAllLines(path)
|> Array.(ignore first element)
|> Array.map processLine
それを達成するためのエレガントでありながら効率的な方法は何でしょうか?
操作が効率的ではないため(配列全体をコピーする必要があるため)、配列の最初の行をスキップする単純な関数はありませんが、代わりにレイジーシーケンスを使用すると簡単に実行できます。
File.ReadAllLines(path)
|> Seq.skip 1
|> Seq.map processLine
配列の結果が必要な場合(seq<'T>
のF#エイリアスである、とは対照的にIEnumerable<'T>
)、最後に追加できますSeq.toArray
。ただし、後で行を繰り返し処理するだけの場合は、おそらくシーケンスを使用できます。
これはトーマスの答えへの追加であり、私は一般的に同意します。注意すべき点の1つは、配列またはシーケンスに行が含まれていない場合にどうなるかです。(またはスキップしたい行より少ない行。)その場合、Seq.skipは例外をスローします。私が考えることができるこれを回避する最も簡潔な方法は次のとおりです。
System.IO.File.ReadAllLines fileName
|> Seq.mapi (fun i elem -> i, elem)
|> Seq.choose (fun (i, elem) -> if i > 0 then Some(elem) else None)
F#配列の最初の要素をスキップするだけmyArray.[1..]
です。この言語がいかにエレガントであるかが大好きです。