Я изучаю Haskell, и я решил заняться небольшим решателем судоку в качестве проекта. Я использовал это задание в качестве guide, и я недавно столкнулся с подзадачей D2
, которая заключается в создании функции, которая будет генерировать блоки судоку (9 сеток 3x3) из доски судоку (сетка 9x9).
Я начал писать следующий код, но быстро понял, что это ужасная идея. Это неуклюжий код, который не является идиоматичным Haskell (на мой взгляд) и полностью нарушает принцип DRY.
type Block = [Maybe Int]
data Sudoku = Sudoku [[Maybe Int]]
blocks :: Sudoku -> [Block]
blocks (Sudoku rs) = block1 : block2 : block3 : block4 : block5 : block6 : block7 : block8 : block9 : []
where block1 = [(rs!!0)!!0] ++ [(rs!!0)!!1] ++ [(rs!!0)!!2] ++ [(rs!!1)!!0] ++ [(rs!!1)!!1] ++ [(rs!!1)!!2]++ [(rs!!2)!!0] ++ [(rs!!2)!!1] ++ [(rs!!2)!!2]
block2 = ...
block3 = ...
...
Мне было интересно, как написать более краткую и идиоматическую функцию для выполнения задачи? Как бы вы ее реализовали? Любые идеи приветствуются!
Я также консультировался с этим предыдущим и, возможно, связанный с этим вопрос SO, но я не был уверен, как преобразовать pythonic-решение в Haskell и нужно ли мне вообще это делать. Я также видел этот вопрос, но я по-другому структурировал свою доску судоку.
Весь мой текущий код можно найти здесь. Кроме того, дайте мне знать, если я могу что-то уточнить.