所以我一直在努力解决过去几个小时打印数独游戏板的问题,我差不多完成了但是我已经陷入了最后一步.所以我所拥有的是一个数据板,表示为"列表列表"(即板= [[1,3,5,7,0,2,0,0,0],[3,4,5,... .],...]
我已经能够使用以下功能打印出具有格式的行:
line i s_board = intercalate " | " . map unwords . chunksOf 3 $ map show a
where
a = s_board!!i
Run Code Online (Sandbox Code Playgroud)
所以通过像"0行板"那样打电话,我会得到"1 3 5 | 7 0 2 | 0 0 0"这部分是我需要的.接下来我尝试使用"do block"输出我需要的板,看起来像这样:
print = do line 0 board
line 1 board
...
Run Code Online (Sandbox Code Playgroud)
这甚至不会编译,当我做这样的事情时:
print = do
line 0 board
line 1 board
Run Code Online (Sandbox Code Playgroud)
适当的列表被多次打印,这是相当混乱的.我想继续努力,包括额外的格式化,比如在每三行之后打印一个字符串,例如"----------",以完成电路板,但我甚至无法让其他东西工作对了.我很感激对这些问题的任何帮助.
生成一个能够接收你的电路板,制作一个大字符串,最后打印它的功能会更容易,更优雅,而不是担心通过do块打印每一行.
所以,如果我们简化你的线显示功能,采取一块板:
showLine :: [Int] -> String
showLine = intercalate " | "
. map unwords
. chunksOf 3
. map show
Run Code Online (Sandbox Code Playgroud)
然后,我们需要获取每一行的字符串表示并将它们放在一起.这看起来非常像showLine代码:
showBoard :: [[Int]] -> String
showBoard = intercalate "---------------------\n"
. map unlines
. chunksOf 3
. map showLine
Run Code Online (Sandbox Code Playgroud)
使用示例板
-- Obviously not a valid sudoku board...
example :: [[Int]]
example = replicate 9 [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
*Main> putStrLn $ showBoard example
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
---------------------
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
---------------------
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
Run Code Online (Sandbox Code Playgroud)