Haskell做关键字

Ock*_*ham 1 haskell

所以我一直在努力解决过去几个小时打印数独游戏板的问题,我差不多完成了但是我已经陷入了最后一步.所以我所拥有的是一个数据板,表示为"列表列表"(即板= [[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)

适当的列表被多次打印,这是相当混乱的.我想继续努力,包括额外的格式化,比如在每三行之后打印一个字符串,例如"----------",以完成电路板,但我甚至无法让其他东西工作对了.我很感激对这些问题的任何帮助.

sab*_*uma 7

生成一个能够接收你的电路板,制作一个大字符串,最后打印它的功能会更容易,更优雅,而不是担心通过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)