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
的作者,他们添加了helpfullpostscanl'
方法。感谢您的回复。在您的评论之后,我在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')