サイクルを使用せずに完全なリストを印刷することは可能ですか?私は試した:
Console.WriteLine([1;2;3;4;5])
そして、最初の3つの要素のみを出力します。
[1;2;3; ... ]
組み込みの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#タイプも自動的に処理することです(たとえば、タプル、区別された共用体またはレコードを含むリストがある場合)。
いいえ、並べ替えのサイクル/ループを使用せずにF#リストの内容を印刷することはできません。すべての要素を印刷するには、各要素を列挙する必要があります。
F#ではループで実行する必要はありませんが、代わりにニースパイプ操作で実行できます
[1;2;3;4;5] |> Seq.iter (fun x -> printf "%d " x)
そしてジュリエットが指摘したように、私は部分的な適用でこれをさらに単純化することができました
[1;2;3;4;5] |> Seq.iter (printf "%d ")
一般に、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 = ()
それを行うためのおそらくより機能的な方法:
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