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 类型的函数=] 给另一个。
我问了一个相关问题
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 类型的函数=] 给另一个。