我正在尝试使用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]]
我似乎无法弄清楚如何将其打印出来。有人对此有经验吗?我似乎无法找到任何例子
答案 0 :(得分:4)
Seq.iter
将迭代序列的所有元素,例如
somelist|> Seq.iter (printfn "%A")
将打印每个元素。 (“%A”说明符擅长打印任意数据的常见情况,但对于大型列表或诸如此类的东西,您可以通过迭代每个元素并单独打印每个元素来执行更精细的控制,例如在新行上的上方。)
答案 1 :(得分:1)
您不使用列表,而是处理序列。由于序列可能是无限的,printf
和朋友只输出前N个元素。有道理。
答案 2 :(得分:0)
Brain和Daniel已经回答了你的问题。我想补充说%A
将使用反射来打印传递给printfn
函数的对象。在你的情况下,它不是简单的项目列表,而是列表列表等等,基本上是一个树。如果这个树太大,那么printfn "%A"
会造成性能问题,你需要编写自己的打印功能,可以遍历树并打印它。