F#: как распечатать полный список (Консоль. WriteLine () печатает только сначала три элемента),

Действительно ли возможно распечатать полный список, не используя цикл? Я попробовал:

Console.WriteLine([1;2;3;4;5])

и это печатает только три первых элемента:

[1;2;3; ... ]
33
задан Nike 25 March 2010 в 21:15
поделиться

4 ответа

Если вы хотите использовать встроенный механизм форматирования 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 # (например, если у вас есть список, содержащий кортежи, размеченные объединения или записи).

52
ответ дан 27 November 2019 в 17:52
поделиться

Нет, невозможно распечатать содержимое списка F # без использования цикла / цикла сортировки. Чтобы напечатать каждый элемент, вы должны пронумеровать каждый из них.

Хотя в F # это не нужно делать с помощью цикла, но вместо этого это можно сделать с помощью хорошей операции конвейера

[1;2;3;4;5] |> Seq.iter (fun x -> printf "%d " x)

И, как указала Джульетта, я мог бы упростить это еще больше с помощью частичного приложения

[1;2;3;4;5] |> Seq.iter (printf "%d ")
19
ответ дан 27 November 2019 в 17:52
поделиться

В общем, если вы хотите изменить способ, которым 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 = ()
7
ответ дан 27 November 2019 в 17:52
поделиться

Возможно, более функциональный способ сделать это:

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
0
ответ дан 27 November 2019 в 17:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: