有没有一种简单的方法打印数组中的每个元素?

3
let x=[|15..20|]
let y=Array.map f x
printf "%O" y

我得到了一些类型信息。

有没有办法在不使用 for 循环的情况下,以逗号为分隔符打印“y”的每个元素?


作业@StackExchange? - Helge Rene Urholm
4个回答

7

可以使用System命名空间中的String.Join或F#原生功能:

<code>let x = [| 15 .. 20 |]

printfn "%s" (System.String.Join(",", x))

x |> Seq.map string |> String.concat "," |> printfn "%s"
</code>

嗯,我真的很喜欢这种管道式编程风格,步骤非常清晰。就像PowerShell一样! - vik santata

2

在这种情况下,使用String.concat来将字符串与分隔符连接起来可能是最好的选择(因为您不希望在末尾有分隔符)。

但是,如果您只想打印所有元素,也可以使用Array.iter

let nums= [|15..20|]
Array.iter (fun x -> printfn "%O" x) nums    // Using function call
nums |> Array.iter (fun x -> printfn "%O" x) // Using the pipe 

在这种情况下添加分隔符比较困难,但可以使用iteri实现:
nums |> Array.iteri (fun i x ->
  if i <> 0 then printf ", "
  printf "%O" x) 

请注意,在第一个示例中,冗长的“fun x ->”是不必要的:Array.iter (printfn "%O") numsnums |> Array.iter (printfn "%O") - CaringDev

1
如果数组很大,这将不会打印整个数组;我认为它只会打印前100个元素。尽管如此,我认为这就是你想要的:
printfn "%A" y

0
如果项目数组很大,您不想生成一个大字符串,另一个选择是生成一个交错序列并跳过第一个项目。以下代码在假定该数组至少有一个元素的情况下工作。
这种方法的一个优点是它清晰地分离了交错项目和打印的行为。它还消除了在每次迭代时检查第一项的必要。
let items = [| 15 .. 20|]

let strInterleaved delimiter items = 
    items 
    |> Seq.collect (fun item -> seq { yield delimiter; yield item}) 
    |> Seq.skip(1)

items
|>  Seq.map string
|>  strInterleaved "," 
|>  Seq.iter (printf "%s")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接