Haskell中实现Vector3列表按索引求和函数的问题
解决方案
首先我们明确核心逻辑:对列表中的Vector3逐个取对应分量相加,空列表返回零向量(求和的单位元)。以下是几种实现方式:
方式1:递归实现(带辅助函数)
先定义辅助函数处理两个向量的分量相加:
addVectors :: Vector3 -> Vector3 -> Vector3 addVectors (V x1 y1 z1) (V x2 y2 z2) = V (x1 + x2) (y1 + y2) (z1 + z2)
再通过递归实现列表求和:
vectorListSum :: [Vector3] -> Vector3 vectorListSum [] = V 0 0 0 -- 空列表返回零向量 vectorListSum (v:vs) = addVectors v (vectorListSum vs) -- 当前向量 + 剩余列表的求和结果
方式2:递归实现(无辅助函数)
如果不想单独写辅助函数,可直接在递归过程中拆包处理分量:
vectorListSum :: [Vector3] -> Vector3 vectorListSum [] = V 0 0 0 vectorListSum ((V x y z):vs) = let V xs ys zs = vectorListSum vs in V (x + xs) (y + ys) (z + zs)
方式3:用foldr简化实现
Haskell的折叠函数foldr可以更简洁地完成累加操作,逻辑和递归一致:
vectorListSum :: [Vector3] -> Vector3 vectorListSum = foldr (\(V x y z) (V xs ys zs) -> V (x+xs) (y+ys) (z+zs)) (V 0 0 0)
结合之前的addVectors函数,代码可读性更强:
vectorListSum :: [Vector3] -> Vector3 vectorListSum = foldr addVectors (V 0 0 0)
验证示例
调用vectorListSum [V 1 2 3, V 4 5 6, V 7 8 9]会得到V 12 15 18,符合对应分量相加的预期。
内容的提问来源于stack exchange,提问作者Tamás Veszelyi
相关产品推荐
相关产品推荐

