2016-06-04 2 views
1

컨텍스트 : Microsoft Visual Studio 2015 커뮤니티; F #F #에서 문자열 [] []을 (를) 트래버스하는 방법

저는 하루에 약 1/2 정도 F #을 배웠습니다. 나는 mLite을 만지작 거리며 보내는 1 년 동안 함수형 프로그래밍을하는 방법에 대해 모호한 생각을 가지고 있습니다.

다음 스크립트는 폴더 트리를 가로 지르고 로그 파일을 가져옵니다. 파일에는 ~으로 구분 된 항목이 있으며 하나 이상있을 수 있습니다. 아이디어는 내가 긴 하나에 모든 로그를 변환 할 것을 되 String[]로를 설정하는 방법을 알아 내기 위해

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 

그래서이 시점에서 dataString[][] 포함하고 나는 손실의 조금에 있어요 벡터 그래서 내가 그것에 대한 다른 변형을 할 수 있습니다. 예를 들어, 각 로그 라인은 datetime으로 시작하므로 모든 것을 하나의 긴 목록으로 바꿔서 datetime을 정렬 할 수 있습니다.

여기에서 오는? 코멘트에 명시된 바와 같이

+2

['Array.concat' (https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/array.concat [ 't] -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 >> concatcollect과 같습니다. 그래서 코드가된다 :

files |> Array.collect (readFile >> dataLines) 
관련 문제