FSharp功能组合:线程化累加器

时间:2015-02-06 21:37:23

标签: f#

我问了一个相关的问题here。我想做类似的事情,但这次通过函数数组线程累加器。我立刻想到了Array.Reduce或Array.Fold,但它们对我不起作用:

let AddTen x =
    x + 10

let MultiplyFive x =
    x * 5

let SubtractTwo x =
    x - 2

let functionArray = [| AddTen; MultiplyFive; SubtractTwo |] 
let calculateAnswer functionArray x = functionArray |>Array.reduce(fun acc f -> f acc)

最后一行抛出此异常:

  

类型不匹配。期待一个       'a - > '但是给了一个       'b在统一''a'和''b - >时,结果类型将是无限的。 'A'

我是否错误地考虑了这个问题?

1 个答案:

答案 0 :(得分:2)

看看这两个:

let calculateReduce = functionArray |> Array.reduce (fun f g -> f >> g)
let calculateFold x = functionArray |> Array.fold (fun acc f -> f acc) x

在reduce版本中,您将获取一系列函数并将它们组合成一个函数,稍后可以在x上调用它。

在折叠版本中,您折叠函数数组,穿过累加器并按顺序将每个函数应用于它。 x是累加器的初始值。

您的原始代码不起作用,因为reduce需要'a -> 'a -> 'a函数,如果函数数组意味着合成,那么当您尝试应用int -> int类型的函数时到另一个。