F#:如何打印完整列表(Console.WriteLine()只打印前三个元素)

时间:2010-03-25 21:15:57

标签: list f#

是否可以在不使用循环的情况下打印完整列表? 我试过了:

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

并且它只打印三个第一个元素:

[1;2;3; ... ]

5 个答案:

答案 0 :(得分:51)

如果您想使用内置的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)

使用printfsprintf的好处是它还会自动处理其他F#类型(例如,如果您有包含元组,区分联合或记录的列表)。

答案 1 :(得分:18)

如果不使用循环/循环排序,则无法打印F#列表的内容。要打印每个元素,您必须枚举每个元素。

在F#中尽管不需要使用循环来完成,但可以使用漂亮的管道操作来完成

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

正如朱丽叶指出的那样,我可以通过部分应用来进一步简化这一过程

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

答案 2 :(得分:7)

通常,如果要更改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 = ()

答案 3 :(得分:0)

可能更有效的方法:

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

答案 4 :(得分:0)

F#Interactive截断列表。为避免这种情况,请调整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]