2016-07-31 6 views
1

Ich versuche, die Gesamtanzahl der Zeilen für alle Dateien in einem bestimmten Verzeichnis zu drucken. Ich erhalte jedoch einen Fehler Type mismatch. Expecting IEnumerable<string> -> 'a but given a 'b list -> 'c list. Ich bin mir nicht sicher, warum das so ist. Hier ist mein Code:Wie fasst man die Länge einer Sammlung in F # zusammen?

let printLengths path = 
    let files = Directory.EnumerateFiles(path) 
    let fileLengths = files |> List.map (fun dir -> Seq.length(File.ReadLines(dir))) 
    printfn "%i" (List.sum fileLengths) 

Antwort

6

System.IO.Directory.EnumerateFiles gibt eine sequence aka IEnumerable<'T> zurück, keine list. Verwenden Sie Seq.map und Seq.sum, um Sequenzen abzubilden oder zu summieren.

Oder für eine kürzere Lösung, verwenden Seq.sumBy:

let printTotalNumberOfLines path = 
    Directory.EnumerateFiles path 
    |> Seq.sumBy (File.ReadAllLines >> Seq.length) 
    |> printfn "%i" 
+0

Danke für die Aufklärung und verbesserte Lösung :) –

3

Du List.map auf files verwenden, aber die Ausgabe von Directory.EnumerateFiles ist ein IEnumerable. List.map funktioniert nur auf list s. Sie könnten stattdessen versuchen, Seq.map zu verwenden, oder files zuerst mit Seq.toList konvertieren.

Verwandte Themen