Действительно ли возможно распечатать полный список, не используя цикл? Я попробовал:
Console.WriteLine([1;2;3;4;5])
и это печатает только три первых элемента:
[1;2;3; ... ]
Если вы хотите использовать встроенный механизм форматирования F # (и избегайте его использования вещь самостоятельно), вы можете использовать функции печати F #, такие как printfn
. Вы можете указать ему спецификатор формата для печати всего списка (с использованием форматирования F #) или печати только нескольких первых элементов (что происходит, когда вы вызываете ToString
):
> printfn "%A" [ 1 .. 5 ];; // Full list using F# formatting
[1; 2; 3; 4; 5]
> printfn "%O" [ 1 .. 5 ];; // Using ToString (same as WriteLine)
[1; 2; 3; ... ]
Если вы хотите использовать Console.WriteLine
(или другой метод .NET) по какой-то причине вы также можете использовать sprintf
, который ведет себя аналогично printf
, но возвращает отформатированную строку в качестве результата:
Console.WriteLine(sprintf "%A" list)
Преимущество использования printf
или sprintf
заключается в том, что он также автоматически работает с другими типами F # (например, если у вас есть список, содержащий кортежи, размеченные объединения или записи).
Нет, невозможно распечатать содержимое списка F # без использования цикла / цикла сортировки. Чтобы напечатать каждый элемент, вы должны пронумеровать каждый из них.
Хотя в F # это не нужно делать с помощью цикла, но вместо этого это можно сделать с помощью хорошей операции конвейера
[1;2;3;4;5] |> Seq.iter (fun x -> printf "%d " x)
И, как указала Джульетта, я мог бы упростить это еще больше с помощью частичного приложения
[1;2;3;4;5] |> Seq.iter (printf "%d ")
В общем, если вы хотите изменить способ, которым printf "% A" печатает ваши объекты так, как fsi.exe показывает значения для вашего типа, вы можете применить атрибут StructuredFormatDisplayAttribute к своему типу:
[<StructuredFormatDisplayAttribute("PP {PrettyPrinter}")>]
type Foo(a:string array) =
let pp = Array.mapi (fun i (s: string) -> sprintf "{idx: %d len: %d contents: '%s'}" i s.Length s) a
member x.PrettyPrinter = pp
> let foo = Foo [|"one";"two";"three"|];;
val foo : Foo =
PP [|"{idx: 0 len: 3 contents: 'one'}"; "{idx: 1 len: 3 contents: 'two'}";
"{idx: 2 len: 5 contents: 'three'}"|]
> printfn "%A" foo;;
PP [|"{idx: 0 len: 3 contents: 'one'}"; "{idx: 1 len: 3 contents: 'two'}";
"{idx: 2 len: 5 contents: 'three'}"|]
val it : unit = ()
Возможно, более функциональный способ сделать это:
let nums = [1;2;3;4;5;6]
let concat acc x = acc + " " + (string x)
let full_list = List.fold concat "" nums
printfn "%s" full_list