Подтвердить что ты не робот

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

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

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

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

[1;2;3; ... ]
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

В общем случае, если вы хотите изменить как способ 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 = ()

Ответ 4

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

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

Ответ 5

F # Интерактивные усеченные списки. Чтобы избежать этого, настройте PrintLength:

fsi.PrintLength <- System.Int32.MaxValue

Теперь он печатает весь список:

> [1..1000];;
val it : int list =
  [1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21;
   22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40;
   41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59;
              and so on, until
   983; 984; 985; 986; 987; 988; 989; 990; 991; 992; 993; 994; 995; 996; 997;
   998; 999; 1000]