我是Haskell的初学者,但我被要求创建一个数独求解器。我一直在用它做一些稳定的进步,但它要求我做的一件事就是打印一个有趣的数独谜题表示。 Puzzle数据类型被定义为列表列表,因此[[Maybe Int]]
由块值([Maybe Int]
组成,代表一行)组成。
功能签名是这样的:
printPuzzle :: Puzzle -> IO ()
如何输出?我知道这可能是一个简单的问题而且我错过了重点,但我还没有达到我在语法方面领先的阶段。任何帮助将非常感激!
答案 0 :(得分:5)
简单漂亮的打印可以通过以下方式非常简洁地完成:
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
从网格中取一行并打印出来 - 使用Data.Maybe
中的maybe
函数,我们可以将其写为每个{{1}的快速地图值为默认"空格"值或表示数字的字符(使用intToDigit
)。
Maybe Int
只是将showPuzzle
映射到外部列表。
showRow
只使用之前的纯定义来提供打印网格的不纯动作,按printPuzzle
打印每行的精美打印。
快速演示:
putStrLn
虽然您可以轻松修改上述代码以打印更明确的内容,例如:
> printPuzzle [[Just 1, Nothing, Just 3],
[Nothing, Just 3, Just 6],
[Just 2, Just 4, Just 5]]
1 3
36
245