在Haskell中输出列表列表?

时间:2018-01-08 13:04:06

标签: list haskell io functional-programming sudoku

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

功能签名是这样的:

printPuzzle :: Puzzle -> IO ()

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

1 个答案:

答案 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