输出 Haskell 中的列表列表?

Outputting a list of lists in Haskell?

我完全是 Haskell 的初学者,但有人要求我创建一个数独求解器。我一直在用它取得一些稳步进展,但它要求我做的一件事是打印一个数独谜题的有效表示。 Puzzle 数据类型定义为列表的列表,因此 [[Maybe Int]] 由 Block 值组成([Maybe Int],代表一行)。

函数签名是这样的:

printPuzzle :: Puzzle -> IO ()

我如何输出这个?我知道这可能是一个简单的问题,我没有抓住要点,但我还没有达到在语法方面取得领先的阶段。任何帮助将非常感激!

可以使用类似以下内容非常简洁地完成简单的漂亮打印:

import Data.Char (intToDigit)

showRow :: [Maybe Int] -> String
showRow = map (maybe ' ' intToDigit)

showPuzzle :: [[Maybe Int]] -> [String]
showPuzzle = map showRow

printPuzzle :: [[Maybe Int]] -> IO ()
printPuzzle = mapM_ putStrLn . showPuzzle
  • showRow 从您的网格中取出一行并打印它 - 使用 maybe function from Data.Maybe, we can write this as a quick map from each Maybe Int value to either a default "blank space" value or the character representing the number (using intToDigit).

  • showPuzzle 只是将 showRow 映射到外部列表。

  • printPuzzle只是使用之前的纯定义来给出打印网格的不纯动作,通过putStrLn'ing每一行的漂亮打印。


快速演示:

> printPuzzle [[Just 1, Nothing, Just 3],
               [Nothing, Just 3, Just 6],
               [Just 2, Just 4, Just 5]]
1 3
 36
245

虽然您可以轻松修改上面的代码以打印更明确的内容,例如:

1X3
X36
245