печатать большие списки в 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 [["Ключевое слово"; "класс"]; ["Идентификатор"; «А»]]; seq [["Блокировать"; "{"]]; seq [["Модификатор"; "общественный"]; ["Тип"; "целое"]; ["Идентификатор"; "Икс;"]]; seq [["Модификатор"; "общественный"]; ["Тип"; "целое"]; ["Идентификатор"; "у;"]]; ...]

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

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

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


person Matt davis    schedule 18.10.2011    source источник


Ответы (3)


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

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

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

person Brian    schedule 18.10.2011

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

person Daniel    schedule 18.10.2011
comment
printf также усекает списки и массивы. - person Ramon Snir; 19.10.2011
comment
Истинный. Но он обрабатывает гораздо более длинные массивы/списки, чем последовательности. - person Daniel; 19.10.2011

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

person Ankur    schedule 19.10.2011
comment
Головной мозг? Да, он кажется умным, но на самом деле... :-) - person Daniel; 19.10.2011