2017-05-29 18 views
-1

我知道這個問題類似於指定爲重複的問題,但我改變了我的方法,所以對於這種特殊情況的任何幫助將不勝感激。在Haskell中使用show實例插入給定矩陣的輪廓

我想爲每個給定的矩陣創建一個顯示實例,它不僅可視化其內容,還可創建帶有列的輪廓。

到目前爲止我的代碼如下:

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 | 
+---+---+---+ 

回答

4

第一個想法是show可能是這個錯誤的地方。有一個一般原則,read應該是show的倒數。雖然你還沒有一個Read實例,但它仍然通常將漂亮的打印放在一個單獨的函數中。但這只是一種風格的東西。

[錯誤的語句刪除]

你希望能夠通過填充出來用空格來處理不同長度的行(據我所知)。因此您需要查找最大行長度。你可能想是這樣

where 
    cols = maximum $ map length rows 

然後你就可以使用你的東西分割線像

sepLine = '+' : concat (replicate cols "----+") 
+0

IMO它的優良的'Show'實例漂亮的打印結果。只是,它應該仍然是有效的Haskell語法。這是[hmatrix](http://hackage.haskell.org/package/hmatrix)的確很好。 – leftaroundabout

+0

由於我是一名Haskell初學者,我不認爲在這一點上使用外部庫會很有用。我主要是想了解事情是如何工作的。你上面的建議意味着我必須用另一個表達式替換unline和unwords,然後定義一個行分隔符? –

+0

@JohnStef,我只在前奏中使用東西。至於我對「unlines」和「unwords」的評論,請忽略它。我的腦海裏有「線條」和「線條」交換。 –