作为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))
我是在正确的轨道上吗?
这是我想要完成的图片:
我想将数组传递给索引的下一个函数 (int; string [])我想返回一个字符串[]。那个回归我想用新索引传递给下一个函数。
提前致谢。
答案 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需要和数组中的类型相同,是什么样的应用得到了?