打印F#中的大列表

时间:2011-10-18 21:09:49

标签: arrays list f# long-integer

我正在尝试使用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 [[“Keyword”; “类”]; [ “标识符”; “一个”]]; seq [[“Block”; “{”]];     seq [[“Modifier”; “上市”]; [“类型”; “INT”]; [ “标识符”; “X;”]];     seq [[“Modifier”; “上市”]; [“类型”; “INT”]; [ “标识符”; “Y”;]]; ...]

我无法进一步打印。我用与以下

一样简单的方式获得相同的行为
printfn "%a" [1 .. 101]]

我似乎无法弄清楚如何将其打印出来。有人对此有经验吗?我似乎无法找到任何例子

3 个答案:

答案 0 :(得分:4)

Seq.iter将迭代序列的所有元素,例如

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

将打印每个元素。 (“%A”说明符擅长打印任意数据的常见情况,但对于大型列表或诸如此类的东西,您可以通过迭代每个元素并单独打印每个元素来执行更精细的控制,例如在新行上的上方。)

答案 1 :(得分:1)

您不使用列表,而是处理序列。由于序列可能是无限的,printf和朋友只输出前N个元素。有道理。

答案 2 :(得分:0)

Brain和Daniel已经回答了你的问题。我想补充说%A将使用反射来打印传递给printfn函数的对象。在你的情况下,它不是简单的项目列表,而是列表列表等等,基本上是一个树。如果这个树太大,那么printfn "%A"会造成性能问题,你需要编写自己的打印功能,可以遍历树并打印它。