2012-06-06 36 views
5

我剛開始使用F#玩的第一個元素,所以這個問題可能會相當基本的...省略在F#數組

我想逐行讀取文本文件中的行,然後忽略第一行並使用給定函數處理其他行。所以我正在考慮沿用以下方法:

File.ReadAllLines(path) 
|> Array.(ignore first element) 
|> Array.map processLine 

什麼是一種優雅而有效的方式來實現它?

回答

9

沒有簡單的函數可以跳過數組中的第一行,因爲操作效率不高(它必須複製整個數組),但如果使用惰性序列,則可以輕鬆完成:

File.ReadAllLines(path) 
|> Seq.skip 1 
|> Seq.map processLine 

如果需要在陣列中(相對於seq<'T>,這是一個IEnumerable<'T> F#別名)的結果,那麼可以添加Seq.toArray到最後。但是,如果您只是想稍後迭代線路,那麼您可能只是使用序列。

2

這是對托馬斯的答案的補充,我普遍認同這一點。有一件事要注意,如果你的數組或序列不包含行,會發生什麼。 (或者比你想跳過的行更少)。在這種情況下,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) 
0

您只需通過myArray.[1..]跳過的F#數組的第一個元素。要愛這種語言是多麼優雅。