F#中的"求和"函数

orl*_*dpm 2 f# inline

我有一个F#中的函数列表,它们都是类型的(float - > float - > float - > float).我想在序列上进行某种折叠以获得一个函数,该函数返回所有函数的总和.

例如,我可以将值1.0,2.0和3.0传递给列表中的每个函数,并从每个函数中获取返回值.然后我可以计算所有这些值的总和.但是,我想概括一下.

我知道如何递归地执行此操作,但我觉得它应该在一行中可行.有没有简洁的方法来完成这项任务?

Tom*_*cek 8

@Lee的解决方案是您正在寻找的一个班轮.如果要保存几个字符,可以使用List.sumBy哪个首先将给定函数应用于列表的元素(类似于List.map),然后对结果求和(就像List.sum):

let sumAll (fs:(_ -> _ -> _ -> float) list) a b c = 
  List.sumBy (fun f -> f a b c) fs
Run Code Online (Sandbox Code Playgroud)

这个和Lee的版本都使用类型注释来指定列表中的函数返回float.这是必需的,因为否则编译器不知道您想要使用哪种数字List.sum(浮点数,整数等).需要解决这种歧义来编译函数.

或者,您可以将函数标记为inline,然后在调用它时将内联(并且它将适用于多种不同的数字类型).您也可以将fs参数作为最后一个参数传递并使用部分函数应用程序:

let inline sumAll a b c = List.sumBy (fun f -> f a b c)
Run Code Online (Sandbox Code Playgroud)

现在您可以使用流水线调用它,如下所示: fs |> sumAll 1 2 3.