给定这个定义和一个测试矩阵:
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| |
我正在尝试编写一个函数,该函数将输出列 sum的列表,例如:[13, 11, 18, 18]
。基本思想是对每个子四叉树求和:
- 如果四叉树是
(C c)
,则输出 a 重复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)的 colsum。
当然这是行不通的(甚至不能编译),因为经过一些递归我们有:
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
任何想法都会很棒,非常感谢......