在 Haskell 中通过 Tridiagonal matrix algorithm 求解线性方程组时,我遇到了以下问题。我们有三个向量: a 、 b 和 c ,我们想要制作第三个向量 c' ,它是它们的组合:c'[i] = c[i]/b[i], i = 0c'[i] = c[i]/(b[i] - a[i] * c'[i-1]), 0 c'[i] = 未定义,i = n - 1上面公式在 Haskell 中的简单实现如下:calcC' a b c = Data.Vector.generate n f 在哪里 n = 数据.向量.长度 a f i = | i == 0 = c!0/b!0 |我 == n - 1 = 0 |否则 = c!i/(b!i - a!i * f (i - 1))由于重复,看起来这个函数 calcC' 的复杂度为 O(n2)。但我们实际需要的只是将另一个具有先前生成值的参数传递给内部函数 f。我用复杂度 O(n) 和辅助函数 generate 编写了自己的 mapP 版本:mapP f xs = mapP' xs 没有 在哪里 mapP' [] _ = [] mapP' (x:xs) xp = xn : mapP' xs (只是 xn) 在哪里 xn = f x xpgenerateP n f = Data.Vector.fromList $ mapP f [0 .. n-1]如您所见, mapP 的行为类似于标准 map ,但也会传递给映射函数先前生成的值或 Nothing 以供第一次调用。我的问题:在 Haskell 中有什么非常标准的方法可以做到这一点吗?我不是重新发明了轮子吗?谢谢。 最佳答案 有两个称为 mapAccumL 和 mapAccumR 的标准函数,它们可以完全满足您的需求。mapAccumL :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])mapAccumR :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])基本上,它们的行为就像 fold 和 map 的组合。map f = snd . mapAccumL (\_ x -> (() , f x) ()foldl f b = fst . mapAccumL (\b x -> (f b x, () ) b关于haskell - 保存并传递先前结果的映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5442447/
10-13 06:33