Создание альтернативного 2D-массива F#

Я использую модуль Array2D в f# и хочу создать с его помощью игровую доску судоку (массив 9x9). Прямо сейчас у меня есть что-то, что работает, и это выглядит так:

let createInitialArray = [| [|for x in 1 .. 9 -> createSquare x 1 |]; 
                            [|for x in 1 .. 9 -> createSquare x 2 |]; 
                            [|for x in 1 .. 9 -> createSquare x 3 |]; 
                            [|for x in 1 .. 9 -> createSquare x 4 |]; 
                            [|for x in 1 .. 9 -> createSquare x 5 |]; 
                            [|for x in 1 .. 9 -> createSquare x 6 |]; 
                            [|for x in 1 .. 9 -> createSquare x 7 |]; 
                            [|for x in 1 .. 9 -> createSquare x 8 |]; 
                            [|for x in 1 .. 9 -> createSquare x 9 |] |]

let sudokuGame = Array2D.init 9 9 ( fun i j -> createInitialArray.[j].[i] )

Мой вопрос в том, есть ли лучший или более компактный способ написать это?

В MSDN о массивах вообще и MSDN об Array2D Я узнал, что есть еще несколько функций, например init, initBased, create и создать на основе. Поскольку я изучаю язык всего несколько недель, я не вижу, как я могу работать с ними.


person Sebastian Lindgren    schedule 26.05.2015    source источник


Ответы (1)


Вы можете полностью отказаться от createInitialArray и встроить вызов createSquare:

let sudokuGame = Array2D.init 9 9 ( fun i j -> createSquare i j )

Или еще короче, опустив тавтологическую лямбду:

let sudokuGame = Array2D.init 9 9 createSquare
person Fyodor Soikin    schedule 26.05.2015
comment
Ах, это выглядит действительно хорошо! Я сейчас еду на автобусе домой, но скоро попробую. Спасибо! - person Sebastian Lindgren; 26.05.2015