web-dev-qa-db-ja.com

F#:リスト全体を印刷する方法(Console.WriteLine()は最初の3つの要素のみを印刷します)

サイクルを使用せずに完全なリストを印刷することは可能ですか?私は試した:

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

そして、最初の3つの要素のみを出力します。

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

組み込みのF#書式設定エンジンを使用する(そして同じことを自分で実装しないようにする)場合は、printfnなどのF#印刷関数を使用できます。リスト全体を印刷する(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
Tomas Petricek

いいえ、並べ替えのサイクル/ループを使用せずにF#リストの内容を印刷することはできません。すべての要素を印刷するには、各要素を列挙する必要があります。

F#ではループで実行する必要はありませんが、代わりにニースパイプ操作で実行できます

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

そしてジュリエットが指摘したように、私は部分的な適用でこれをさらに単純化することができました

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

一般に、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
ssp

それを行うためのおそらくより機能的な方法:

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