How to traverse String[][] in F#

北慕城南 提交于 2020-01-06 02:47:08

问题


Context: Microsoft Visual Studio 2015 Community; F#

I've been learning F# for about 1/2 a day. I do have a vague idea of how to do functional programming from a year spent fiddling with mLite.

The following script traverses a folder tree and pulls in log files. The files have entries delimited by ~ and there may be one or more there.

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

So at this point data contains a String[][] and I'm at a bit of a loss to figure out how to turn it into a String[], the idea being that I want to convert all the logs into one long vector so that I can do some other transformations on it. For example, each log line begins with a datetime so having turned it all into one long list I can then sort on the datetime.

Where to from here?


回答1:


As stated in the comments, you can use Array.concat :

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

Now some refactoring, the composition of two maps is equivalent to the map of the composition of both functions.

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

Finally map >> concat is equivalent to collect. So your code becomes:

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


来源:https://stackoverflow.com/questions/37626512/how-to-traverse-string-in-f

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!