Haskell 保存并传递先前结果的映射

Haskell 保存并传递先前结果的映射,haskell,map,Haskell,Map,在哈斯克尔求解线性方程组时,我遇到了以下问题 我们有三个向量:a、b和c,我们想制作第三个向量c',它是它们的组合: c'[i] = c[i] / b[i], i = 0 c'[i] = c[i] / (b[i] - a[i] * c'[i-1]), 0 < i < n - 1 c'[i] = undefined, i = n - 1 可以看到,mapP的作用类似于标准的map,但也会传递到之前生成的值的映射函数,或者对于第一次调用,Nothing 我的问题是:在Haskell有什么

在哈斯克尔求解线性方程组时,我遇到了以下问题

我们有三个向量:
a
b
c
,我们想制作第三个向量
c'
,它是它们的组合:

c'[i] = c[i] / b[i], i = 0 c'[i] = c[i] / (b[i] - a[i] * c'[i-1]), 0 < i < n - 1 c'[i] = undefined, i = n - 1 可以看到,
mapP
的作用类似于标准的
map
,但也会传递到之前生成的值的映射函数,或者对于第一次调用,
Nothing

我的问题是:在Haskell有什么标准的方法可以做到这一点吗?我不是重新创造了这个世界吗


谢谢。

调用了两个标准函数,它们完全可以满足您的需要

mapAccumL :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])
mapAccumR :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])
基本上,它们的行为类似于
折叠
映射
的组合

map   f   = snd . mapAccumL (\_ x -> (()   , f x) ()
foldl f b = fst . mapAccumL (\b x -> (f b x, () ) b

如果您使用Data.Array,它是惰性的,您可以在定义c时直接引用c来表示循环。

在我的例子中,以下代码似乎是上面公式的最简单实现:

import qualified Data.Vector.Generic as V calcC' a b c = V.postscanl' f 0.0 $ V.zip3 a b c where f c' (a, b, c) = c / (b - a * c') 将限定的Data.Vector.Generic作为V导入 calcC'a b c=V.postscanl'f 0.0$V.zip3 a b c 哪里 fc'(a,b,c)=c/(b-a*c')
感谢
Vector
的作者,他们添加了helpfull
postscanl'
方法。

感谢您的回复。在您的评论之后,我在Data.Vector库中找到了PRESCAL函数,它似乎是我的generateP和mapP的组合。
map   f   = snd . mapAccumL (\_ x -> (()   , f x) ()
foldl f b = fst . mapAccumL (\b x -> (f b x, () ) b
import qualified Data.Vector.Generic as V calcC' a b c = V.postscanl' f 0.0 $ V.zip3 a b c where f c' (a, b, c) = c / (b - a * c')