【问题标题】:Feeding an array to printfn将数组馈送到 printfn
【发布时间】:2017-02-23 03:47:40
【问题描述】:

我正在打印井字游戏板。我为电路板的每个单元格设置了一个字符数组,并为电路板提供了一个格式字符串。我目前正在做:

let cells = [| 'X'; 'O'; 'X'; 'O'; 'X'; 'O'; ' '; ' '; ' ' |]
printfn ".===.===.===.\n\
         | %c | %c | %c |\n\
         .===.===.===.\n\
         | %c | %c | %c |\n\
         .===.===.===.\n\
         | %c | %c | %c |\n\
         .===.===.===.\n" cells.[0] cells.[1] cells.[2] cells.[3] cells.[4] cells.[5] cells.[6] cells.[7] cells.[8]

有没有办法在不显式枚举数组中的所有 9 个项目的情况下将单元数组提供给 printfn?我可以以某种方式使用 Array.fold 或 kprintf 吗?

【问题讨论】:

    标签: f# printf


    【解决方案1】:

    Funk 的回答非常好,但我认为您可以通过引入 join 函数来连接元素(单个单元格或行)并在它们之间和周围使用分隔符来使其更简单。

    let join s arr = sprintf "%s%s%s" s (String.concat s arr) s
    

    那么你可以这样做:

    cells
    |> Seq.chunkBySize 3
    |> Seq.map (Seq.map (sprintf " %c ") >> join "|")
    |> Seq.map (fun s -> s + "\n")
    |> join ".===.===.===.\n"
    |> printfn "%s"
    

    【讨论】:

    • 现在更像了!
    【解决方案2】:

    它远非性感,但有一种模式可以找到。

    cells
    |> Array.toList
    |> List.chunkBySize 3
    |> List.fold 
        (fun acc list -> acc + 
                         (list |> List.fold (fun acc char -> acc + sprintf "| %c " char) "") + 
                         "|\n.===.===.===.\n") 
        ".===.===.===.\n"
    |> printf "%s"
    

    【讨论】:

      【解决方案3】:

      对函数的参数的每次连续应用都会产生不同的类型。例如:

      let f1 = printfn "%d %d %d"  // f1 : int -> int -> int -> unit
      let f2 = f1 0  // f2 : int -> int -> unit
      let f3 = f2 1  // f3 : int -> unit
      let r = f3 2   // r  : unit
      

      注意f1f2f3r 都有不同的类型。不同的类型意味着您不能将它们塞入通用数据结构中,例如列表或序列。

      (老实说,有一种方法可以使用方法重载来解决这个问题,但这往往会破坏编译器,并且通常对于实际应用程序来说不是必需的)

      我宁愿走另一条路:

      for i in 0..2 do
        printf ".===.===.===.\n|"
        for j in 0..2 do
          printf "%c |" cells.[i*3+j]
        printfn ""
      printfn ".===.===.===."
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-01
        • 1970-01-01
        • 2014-10-13
        • 2016-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多