输出 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
我完全是 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 fromData.Maybe
, we can write this as a quick map from eachMaybe Int
value to either a default "blank space" value or the character representing the number (usingintToDigit
).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