web-dev-qa-db-fra.com

F #: comment imprimer la liste complète (Console.WriteLine () n'imprime que les trois premiers éléments)

Est-il possible d'imprimer la liste complète sans utiliser cycle? J'ai essayé:

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

et il n’imprime que trois premiers éléments:

[1;2;3; ... ]
30
Nike

Si vous souhaitez utiliser le moteur de formatage F # intégré (et éviter d'implémenter vous-même la même chose), vous pouvez utiliser les fonctions d'impression F # telles que printfn. Vous pouvez lui donner un spécificateur de format pour imprimer une liste complète (en utilisant le formatage F #) ou seulement quelques premiers éléments (ce qui se produit lorsque vous appelez 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; ... ]

Si vous souhaitez utiliser Console.WriteLine (ou une autre méthode .NET) pour une raison quelconque, vous pouvez également utiliser sprintf qui se comporte de la même manière que printf, mais renvoie la chaîne mise en forme comme résultat:

Console.WriteLine(sprintf "%A" list)

L’utilisation de printf ou sprintf présente l’avantage de traiter automatiquement les autres types de caractères F # (par exemple, si vous avez une liste contenant des nuplets, des unions discriminées ou des enregistrements).

50
Tomas Petricek

Non, il n'est pas possible d'imprimer le contenu d'une liste F # sans utiliser un cycle/une boucle. Pour imprimer chaque élément, vous devez énumérer chacun d’eux.

En F # bien que cela n’ait pas besoin d’être fait avec une boucle, mais plutôt avec une opération Nice pipe

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

Et comme Juliet l'a souligné, je pourrais simplifier cela davantage avec une application partielle

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

En général, si vous souhaitez modifier de manière graphique "% A" de vos objets de manière à afficher les valeurs de votre type dans fsi.exe, vous pouvez appliquer l'attribut StructuredFormatDisplayAttribute à votre type:

[<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
ssp

Une façon peut-être plus fonctionnelle de le faire:

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
TwentyMiles