自行车流水线

问题描述:

我有一个矩阵:Array2D和功能自行车流水线

let DivideAndSubstract value index (matrix: float[,]) = 
    //something that returns a matrix 

,所以我需要这个功能n次应用到我的矩阵这样的:

matrix 
|> DivideAndSubstract matrix.[0,0] 0 
|> DivideAndSubstract matrix.[1,1] 1 
|> DivideAndSubstract matrix.[2,2] 2 
.... 
|> DivideAndSubstract matrix.[n,n] n 

其中n = Array2D.length1矩阵 - 1
我该如何实现这种流水线?

从我的头顶:

{0..n} |> Seq.fold (fun M k -> DivideAndSubtract matrix.[k,k] k M) matrix 

编辑:几句话不会伤害答案:

使用折叠为x的“申请F到典型模式并将F应用于结果并将F应用于该结果......直到我不需要再应用F为止。上述命令行版本将为

let mutable M = matrix 
for k in 0..n do 
    M <- DivideAndSubtract matrix.[k,k] k M 
M 

折线内,M表示每一步的中间结果。它可能需要一段时间才能掌握褶皱的工作方式,但一旦你做了,它们就非常强大。

+0

循环应该看起来像'M 2011-02-26 12:25:52

+0

正确。洗了澡,意识到fold应该是'|> List.fold(fun M k - > DivideAndSubtract M. [k,k] k M)matrix'现在它可以工作,谢谢 – 2011-02-26 12:44:41

+1

你也可以替换'[0..n ] |> List.fold' by {0..n} |> Seq.fold',所以没有创建列表。 – Stringer 2011-02-26 12:44:58