2016-06-04 3 views
1

Контекст: Microsoft Visual Studio 2015 Community; F #Как перемещаться по строке [] [] в F #

Я изучаю F # около 1/2 в день. У меня есть смутное представление о том, как выполнять функциональное программирование с года, проведенного вокалистом, с mLite.

Следующий сценарий пересекает дерево папок и вытаскивает файлы журналов. В файлах есть записи, разделенные ~, и там может быть один или несколько.

open System 
open System.IO 

let files = 
    System.IO.Directory.GetFiles("C:\\scratch\\snapshots\\", "*.log", SearchOption.AllDirectories) 

let readFile (file: string) = 
    //Console.WriteLine(file) 
    let text = File.ReadAllText(file) 
    text 

let dataLines (line: string) = 
    line.Split('~') 

let data = 
    files |> Array.map readFile |> Array.map dataLines 

Таким образом, на данный момент data содержит String[][] и я на немного потери, чтобы выяснить, как превратить его в String[], идея заключается в том, что я хочу, чтобы преобразовать все журналы в один длинный вектор, так что я могу сделать некоторые другие преобразования на нем. Например, каждая строка журнала начинается с datetime, поэтому, превратив все это в один длинный список, я могу сортировать дату и время.

Куда отсюда?

+2

[ 'Array.concat'] (https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/array.concat [ 'т] -function- [FSharp])? – ildjarn

+0

Ну, это было просто. Ну, так много для этого. – bugmagnet

ответ

6

Как указано в комментариях, вы можете использовать Array.concat:

files |> Array.map readFile |> Array.map dataLines |> Array.concat 

Теперь некоторые рефакторинга, композиция двух карт эквивалентна карте состава обеих функций.

files |> Array.map (readFile >> dataLines) |> Array.concat 

Наконец map >> concat эквивалентно collect. Так что ваш код становится:

files |> Array.collect (readFile >> dataLines)