在 Haskell 中使用显示实例在给定矩阵中插入轮廓

Inserting outline in a given matrix using a show instance, in Haskell

我知道这个问题与指定为重复的问题类似,但我改变了我的方法,因此对于这个特殊情况的任何帮助将不胜感激。

我想为每个给定的矩阵创建一个显示实例,它不仅可以可视化其内容,还可以创建一个包含列的大纲。

到目前为止我的代码如下:

instance Show a => Show (Mat a) where
  show  =  unlines . map (unwords . map ((++" |") . show)) . mrows

我得到的输出是:

1 | 2 | 3 |
4 | 5 | 6 |

我无法执行的是在矩阵上方、下方和中间插入行,看起来像以下示例:

+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 | 
+---+---+---+

第一个想到的是show可能是放错地方了。有一个一般原则,read 应该是 show 的倒数。虽然您没有 Read 实例,但通常将漂亮打印放在单独的函数中。然而,这只是一种风格。

[删除不正确的陈述]

您希望能够通过用空格填充它们来处理不同长度的行(据我所知)。因此,您需要找到最大行长度。你可能想要像

这样的东西
where
   cols = maximum $ map length rows

然后您可以使用类似

的方式生成分隔线
   sepLine = '+' : concat (replicate cols "----+")