2014-06-05 223 views
3

我想打印出列矩陣的內容在Haskell:如何打印列矩陣?

data Vector n e where 
    Nil :: Vector Zero e 
    (:>) :: e -> Vector n e -> Vector (Succ n) e 

infixr :> 

data Matrix r c e where 
    ColMatrix :: Vector r e -> Matrix r One e 
    (:|) :: Vector r e -> Matrix r c e -> Matrix r (Succ c) e 

infixr :| 

instance Show e => Show (Matrix r c e) where 
    show (ColMatrix v) = -- ... 
    show (v :| m)  = -- ... 

我不知道如何實現這一點,雖然。合乎邏輯的進程是去

1 4 7 
2 5 8 
3 6 9 

但打印到終端並不使這特別容易。

如何爲ColMatrix實現Show的這個實例?

+2

這裏真的有兩個問題....你如何做Haskell的東西(即 - 創建Vector的迭代通過值等實例),以及你如何做輸出格式化(即填充在所有的空格中正確地獲得均勻間隔的列)。你更關心哪一方面?後者是有點痛苦的處理,因爲你必須預先迭代所有的值來獲得列的寬度,然後再次運行通過它實際輸出文字.... – jamshidh

+0

@jamshidh老實說,我didn當元素長度不同時,甚至不會考慮列排列......現在,我主要對前者感興趣。當時間到了的時候,我可能會後來/自己找出對齊的東西。 – sdasdadas

回答

1

你可能要考慮像布倫特Yorgey的boxes包,其維護我最近接手。使用text將每個數字放在一個框中,使用//來構建這些列,然後使用<+>將這些列放在一個矩陣中。然後render的結果。如果你喜歡,你可以使用cols來比較列粘貼前的寬度,這樣你可以將它們全部填充到相同的寬度。

請注意,Show而不是爲漂亮打印。它旨在用於人類可讀的序列化爲類似Haskell的格式。

1

這是一個使用普通列表和列表庫功能的解決方案。

toList :: Vector n e -> [e] 
toList Nil = [] 
toList (a :> v) = a : toList v 

instance Show e => Show (Matrix r c e) where 
    show (ColMatrix v) = concat $ intersperse " " (map show (toList v)) 
    show (v :| m)  = show (ColMatrix v) ++ "\n" ++ show m