我问了一个相关的问题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'
我是否错误地考虑了这个问题?
答案 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
类型的函数时到另一个。