2017-02-22 8 views
5

Я печатаю плату Tic-Tac-Toe. У меня есть массив символов для каждой ячейки платы и строка формата для платы. Я в настоящее время делаю:Кормление массива printfn

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] 

Есть ли способ, чтобы накормить массив ячеек в printfn без явного перечисления всех 9 элементов в массиве? Могу ли я использовать Array.fold или kprintf каким-то образом?

ответ

5

ответ Функа довольно хорошо, но я думаю, что вы можете сделать это проще, вводя 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" 
+0

Теперь это больше нравится! – Funk

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 

Обратите внимание, как f1, f2, f3 и r все имеют разные типы. Различные типы означают, что вы не можете вставить их в общую структуру данных, такую ​​как список или последовательность.

(честно говоря, есть способ пойти об этом, используя перегрузках метод, но, как правило, сломать компилятор и вообще не является необходимым для реальных приложений)

Я предпочел бы пойти другим путем:

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

Это далеко не сексуальный, но есть шаблон, который можно найти.

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" 
Смежные вопросы