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

FSharp Functional Composition: Threading an accumlator

我问了一个相关问题。我想做类似的事情,但这次通过函数数组将累加器线程化。我立即想到 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)

最后一行抛出这个异常:

Type mismatch. Expecting a 'a -> 'b but given a 'b The resulting type would be infinite when unifying ''a' and ''b -> 'a'

我是不是想错了问题?

看看这两个:

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 函数,在函数数组的情况下这意味着组合,而您试图应用一个 [=14 类型的函数=] 给另一个。