F#通过Array.Reduce线程化函数的结果

时间:2015-02-23 22:11:35

标签: f#

作为this问题的后续,我有一个函数返回一个由输入数组组成的数组,然后是函数中计算的其他元素。

我想使用高阶函数多次调用此函数,每次将先前函数调用的结果数组线程化为下一个函数调用。我相信array.map是这里的最佳选择,但我不确定。这是我到目前为止(注意最后一行不编译):

let myFunction (index:int, allLetters: string[]) =
    let computedArray = [|"A";"B";"D"|]
    Array.append allLetters computedArray

let allLetters = [||]
[|1..10|] |> Array.reduce(fun acc -> myFunction(acc,allLetters))

我是在正确的轨道上吗?

这是我想要完成的图片: enter image description here

我想将数组传递给索引的下一个函数 (int; string [])我想返回一个字符串[]。那个回归我想用新索引传递给下一个函数。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我不明白你想要达到什么目的,请澄清一下。所以很难想出一个示例代码,无论如何我都理解:

Array.map在这里似乎没有帮助,因为每个函数应用程序对于数组的每个元素都是独立的,但是你需要对一个累加器进行线程化。

Array.fold可能就是你要找的东西。它计算线程化前一个函数应用程序结果的所有数组元素之间的函数。您需要为累加器指定初始状态。

Array.reduce只是一个特殊的折叠,其中数组的第一个元素用作初始状态(累加器),当然如果Array为空它将失败。

答案 1 :(得分:0)

如果您查看MSDN,以下是reduce的示例:

let names = [| "A"; "man"; "landed"; "on"; "the"; "moon" |]
let sentence = names |> Array.reduce (fun acc item -> acc + " " + item)

然后我添加了一个lambda调用的函数:

let firstLetter (s:System.String) = s.Substring(0,1)
let names = [| "A"; "man"; "landed"; "on"; "the"; "moon" |]
let sentence = names |> Array.reduce (fun acc item -> acc + " " + firstLetter(item))

然后我在firstLetter函数中添加了第二个参数:

let firstLetter (s:System.String, s':System.String) = s.Substring(0,1)
let names = [| "A"; "man"; "landed"; "on"; "the"; "moon" |]
let sentence = names |> Array.reduce (fun acc item -> acc + " " + firstLetter(item, acc))

最后,我将firstLetter函数的返回值更改为元组:

let firstLetter (s:System.String, s':System.String) = s.Length, s.Substring(0,1)
let names = [| "A"; "man"; "landed"; "on"; "the"; "moon" |]
let sentence = names |> Array.reduce (fun acc item -> acc + " " + firstLetter(item, acc))

编译器不喜欢这样:

  

类型' int * string'与类型'字符串'

不匹配

所以看起来reduce accumulator需要和数组中的类型相同,是什么样的应用得到了?