печатать большие списки в F # - PullRequest
0 голосов
/ 19 октября 2011

Я пытаюсь напечатать большой список с помощью 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 [["Модификатор"; "Общественность"]; ["Тип"; "INT"]; ["Идентификатор"; "Икс;"]]; seq [["Модификатор"; "Общественность"]; ["Тип"; "INT"]; ["Идентификатор"; "У";]]; ...]

Я не могу заставить его печатать дальше. Я получаю такое же поведение с чем-то простым, как показано ниже

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

Я не могу понять, как распечатать это. У кого-нибудь есть опыт с этим? Я не могу найти примеры

Ответы [ 3 ]

4 голосов
/ 19 октября 2011

Seq.iter будет перебирать все элементы последовательности, например,

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

напечатает каждый из элементов. (Спецификатор "% A" хорош в общем случае для печати произвольных данных, но для больших списков или чего-то еще, вы можете осуществлять более точное управление, как здесь, перебирая каждый элемент и печатая каждый отдельно, например, на новой строке как выше.)

1 голос
/ 19 октября 2011

Вы не работаете со списками, вы работаете с последовательностями.Поскольку последовательности могут быть бесконечными, printf и друзья выводят только первые N элементов.Имеет смысл.

0 голосов
/ 19 октября 2011

Мозг и Даниэль уже ответили на ваш вопрос.Я бы добавил, что %A будет использовать отражение для печати объекта, переданного функции printfn.В вашем случае это не просто список элементов, а список из списка и т. Д., Который в основном является деревом.Если это дерево слишком велико, то printfn "%A" может вызвать проблемы с производительностью, и вам потребуется написать собственную функцию печати, которая могла бы обходить дерево и печатать его.

...