簡體   English   中英

將數組送入printfn

[英]Feeding an array to printfn

我打印的是Tic-Tac-Toe板。 我有一個字符串,用於電路板的每個單元格和電路板的格式字符串。 我現在正在做:

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]

有沒有辦法將cells數組提供給printfn而不顯式枚舉數組中的所有9個項目? 我可以用某種方式使用Array.fold或kprintf嗎?

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"

它遠非性感,但有一種模式可以找到。

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"

每次連續應用函數的參數都會產生不同的類型。 例如:

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 ".===.===.===."

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM