在 Haskell 中输出一个列表的列表?

3
我是一个完全不懂Haskell的新手,但我被要求创建一个数独求解器。我已经在进行一些稳定的进展,但其中之一是要求我打印数独谜题s的有效表示。拼图数据类型被定义为列表的列表,因此是[[Maybe Int]],由Block值([Maybe Int],表示一行)组成。
函数签名如下: printPuzzle :: Puzzle -> IO () 我该如何输出它?我知道这可能是一个简单的问题,我还没有理解语法的阶段。任何帮助都将不胜感激!

1
如果Puzzle[[Maybe Int]]的别名,那么它应该已经有一个Show实例,这意味着您可以使用print来打印它。 - Mark Seemann
2
然而,这可能无法给您所需的格式。也许unlinesintercalate对您有所帮助... - Mark Seemann
2
这个问题可以从 [mcve] 中受益。你想要如何格式化输出? - hnefatl
1个回答

6

以下代码可简单地对其进行漂亮的打印:

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函数,我们可以将每个Maybe Int值快速映射到默认的“空格”值或表示数字的字符(使用intToDigit)。

  • 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

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

1X3
X36
245

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接