2015-02-23 56 views
-1

函数作为后续于this问题的结果,我有一个返回包含一个输入数组的数组,然后在函数计算某些其它元件的功能。F#线程通过Array.Reduce

我想使用高阶函数多次调用此函数,每次线程现有函数调用的结果阵列到下一个功能调用。我相信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;串[])和欲返回字符串[ ]。我想通过新索引传入下一个函数。

在此先感谢。

+1

'Array.fold'? 'Array.scan'?我不清楚你想要达到什么目的。你能分享一些输入数据和预期输出吗? – 2015-02-23 22:50:00

+0

在原始问题中添加了一张图片。这有帮助吗? – 2015-02-24 02:27:04

+0

对不起,这并没有多大帮助。第五个样本中的“E”来自哪里? – 2015-02-24 07:25:27

回答

0

我不明白究竟要达到什么样的,请澄清。所以很难拿出一个示例代码,无论如何从我的理解:无论如何,从我的理解:

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

Array.fold可能是你在找什么。它计算所有数组元素之间的函数,这些数组元素对前一个函数应用程序的结果进行线程化您需要指定累加器的初始状态。

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

+0

在原始问题中添加了一张图片。这有帮助吗? – 2015-02-24 02:26:42

+0

谢谢,但如果给出相同的输入(情况3和4),您希望获得不同的输出,怎么可能? – Gustavo 2015-02-24 08:04:15

+0

副作用编程。 :-) – 2015-02-24 11:44:22

0

如果你看一下MSDN,这里是降低例如:

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

我再补充说,拉姆达调用一个函数:

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)) 

最后,我改变了从firstL埃特功能是一个元组:

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)) 

编译器不喜欢:

类型“诠释*字符串”不匹配的类型“字符串”

所以看起来像reduce累加器需要与数组中类型相同的类型是什么得到了减少应用?

+0

是的,类型应该是相同的。对于折叠,由于累加器的类型可能是其他内容,因此您有更多的灵活性。请下一次给我发一条消息,因为如果你把你的问题写成答案,我不会收到通知。 – Gustavo 2015-02-27 17:40:53