2011-10-18 67 views
0

我想打印一個大名單與F#和是一個艱難的時刻。我正在嘗試在F#中創建一個詞法分析器,我相信我已經完成了,但似乎無法打印整個列表來檢查它。打印大型列表,F#

這裏是什麼,我試圖做

let modifierReg = Regex("(public|private)"); 
let isModifier str = if (modifierReg.IsMatch(str)) then ["Modifier"; str] else ["Keyword"; str] 

let readLines filePath = seq { 
    use sr = new StreamReader (filePath:string) 
    while not sr.EndOfStream do 
     yield sr.ReadLine() } 

let splitLines listArray = 
    listArray 
    |> Seq.map (fun (line: string) -> let m = Regex.Match(line, commentReg) in if m.Success then (m.Groups.Item 1).Value.Split([|' '|], System.StringSplitOptions.RemoveEmptyEntries) else line.Split([|' '|], System.StringSplitOptions.RemoveEmptyEntries)) 

let res = 
    string1 
    |> readLines 
    |> splitLines 

let scanLines lexicons = 
    lexicons 
    |> Seq.map (fun strArray -> strArray |> Seq.map (fun str -> isModifier(str))) 

let printSeq seq = 
    printfn "%A" seq 

let scanner filePath = 
    filePath 
    |> readLines 
    |> splitLines 
    |> scanLines 

let scannerResults = scanner pathToCode 
printSeq scannerResults 

當我嘗試打印的清單,我得到以下

SEQ 〔序列[「關鍵字」的例子。 「類」]; [ 「標識符」; 「一個」]]; seq [[「Block」; 「{」]]; seq [[「Modifier」; 「上市」]; [「類型」; 「INT」]; [ 「標識符」; 「X;」]]; seq [[「Modifier」; 「上市」]; [「類型」; 「INT」]; [ 「標識符」; 「Y」;]]; ...]

我不能讓它進一步打印任何。我得到相同的行爲,如下所示簡單

printfn "%a" [1 .. 101]] 

我似乎無法弄清楚如何打印出來。有人對此有經驗嗎?我似乎無法找到任何例子

回答

4

Seq.iter遍歷整個序列的所有元素,因此例如

somelist|> Seq.iter (printfn "%A") 

將打印每個元素。 (「%A」說明符擅長打印任意數據的常見情況,但對於大型列表或任何其他類型,您可以通過遍歷每個元素並單獨打印每個元素(例如在新行上)以上)。

+0

謝謝,這工作完美。 –

1

你不處理列表,你與序列工作。由於序列可能是無限的,因此printf和朋友只輸出前N個元素。說得通。

+0

'printf'也會截斷列表和數組。 –

+0

是的。但它比序列處理更長的數組/列表。 – Daniel

0

腦和丹尼爾已經回答了你的問題。我會補充說%A將使用反射來打印傳遞給printfn函數的對象。在你的情況下,它不是簡單的項目列表,而是列表列表等等,它基本上是一棵樹。如果這棵樹太大,那麼printfn "%A"會造成性能問題,您需要編寫自己的打印函數,可以遍歷樹並打印它。

+0

「大腦」?是的,他看起來很聰明,但真的...... :-) – Daniel