F #: как напечатать полный список (Console.WriteLine () печатает только первые три элемента) - PullRequest
32 голосов
/ 26 марта 2010

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

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

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

[1;2;3; ... ]

Ответы [ 4 ]

51 голосов
/ 26 марта 2010

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

18 голосов
/ 26 марта 2010

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

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

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

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

[1;2;3;4;5] |> Seq.iter (printf "%d ")
7 голосов
/ 26 марта 2010

Как правило, если вы хотите изменить способ печати вашего объекта 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 = ()
0 голосов
/ 26 марта 2010

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...