Учитывая это определение и тестовую матрицу:
data (Eq a, Show a) => QT a = C a | Q (QT a) (QT a) (QT a) (QT a)
deriving (Eq, Show)
data (Eq a, Num a, Show a) => Mat a = Mat {nexp :: Int, mat :: QT a}
deriving (Eq, Show)
-- test matrix, exponent is 2, that is matrix is 4 x 4
test = Mat 2 (Q (C 5) (C 6) (Q (C 1) (C 0) (C 2) (C 1)) (C 3))
| | |
| 5 | 6 |
| | |
-------------
|1 | 0| |
|--|--| 3 |
|2 | 1| |
Я пытаюсь написать функцию, которая будет выводить список сумма столбцов , например: [13, 11, 18, 18]
. Основная идея состоит в суммировании каждого субдерева:
- Если quadtree равен
(C c)
, выведите повторяющееся 2 ^ (n - 1)
значение c * 2 ^ (n - 1)
. Пример : первое четверное дерево (C 5)
, поэтому мы повторяем 5 * 2^(2 - 1) = 10
, 2 ^ (n - 1) = 2
раз, получая [5, 5].
- В противном случае, учитывая
(Q a b c d)
, мы zipWith
получаем значения a и c (и b и d).
Конечно, не работает (даже не компилируется), потому что после некоторой рекурсии мы имеем:
zipWith (+) [[10, 10], [12, 12]] [zipWith (+) [[1], [0]] [[2], [1]], [6, 6]]
Поскольку я начинаю с Haskell, я чувствую, что что-то упустил, нужен совет по поводу функции, которую я могу использовать. Не работает Определение colsum:
colsum :: (Eq a, Show a, Num a) => Mat a -> [a]
colsum m = csum (mat m)
where
n = nexp m
csum (C c) = take (2 ^ n) $ repeat (c * 2 ^ n)
csum (Q a b c d) = zipWith (+) [colsum $ submat a, colsum $ submat b]
[colsum $ submat c, colsum $ submat d]
submat q = Mat (n - 1) q
Любые идеи были бы великолепны и высоко ценится ...