自行车流水线
问题描述:
我有一个矩阵: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表示每一步的中间结果。它可能需要一段时间才能掌握褶皱的工作方式,但一旦你做了,它们就非常强大。
循环应该看起来像'M 2011-02-26 12:25:52
正确。洗了澡,意识到fold应该是'|> List.fold(fun M k - > DivideAndSubtract M. [k,k] k M)matrix'现在它可以工作,谢谢 – 2011-02-26 12:44:41
你也可以替换'[0..n ] |> List.fold' by {0..n} |> Seq.fold',所以没有创建列表。 – Stringer 2011-02-26 12:44:58