【问题标题】:Outputting a list of lists in Haskell?在 Haskell 中输出列表列表?
【发布时间】:2018-06-17 11:12:27
【问题描述】:

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

函数签名是这样的:

printPuzzle :: Puzzle -> IO ()

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

【问题讨论】:

  • 如果Puzzle[[Maybe Int]]的别名,它应该已经有一个Show实例,这意味着你可以使用print
  • 但是,这可能不会为您提供所需的格式。也许unlinesintercalate 对你有帮助……
  • 这个问题可以从minimal reproducible example 中受益。您究竟想如何格式化输出?

标签: list haskell io functional-programming sudoku


【解决方案1】:

简单的漂亮打印可以通过以下方式非常简洁地完成:

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.Maybemaybe 函数,我们可以将其写为从每个 Maybe Int 值到默认值“空格”值或代表数字的字符(使用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

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2021-08-06
    相关资源
    最近更新 更多