用list.fold找到平均值

use*_*904 0 f# f#-interactive

只是尝试制作一个非常简单的平均值float list -> float,即可找到列表的平均值.这是我的代码:

let list ls = List.fold (fun acc float -> acc + float) 0.0 ls;;

list [1.60; 2.30; 5.0; 2.30];;
Run Code Online (Sandbox Code Playgroud)

输出是 11.2

我需要在函数中添加一些可以11.2x元素划分来找到平均值的东西.

有帮助吗?

Car*_*ten 5

如果你想只迭代列表一次你可以平行计算它的长度(使用元组`(sum,len)'作为累加器)然后除以:

let avg xs = 
   xs 
   |> List.fold (fun (sum,len) x -> (sum+x,len+1.0)) (0.0,0.0) 
   |> (fun (sum,len) -> sum / len)
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以用无点样式编写:

let avg = 
   List.fold (fun (sum,len) x -> (sum+x,len+1.0)) (0.0,0.0) 
   >> (fun (sum,len) -> sum / len)
Run Code Online (Sandbox Code Playgroud)

这给你:

> avg [1.0;2.0;3.0];;
val it : float = 2.0
Run Code Online (Sandbox Code Playgroud)

但当然,扩展功能的最简单方法是获取列表的长度并除以它:

let avg ls = 
   List.fold (fun acc float -> acc + float) 0.0 ls / (float ls.Length)
Run Code Online (Sandbox Code Playgroud)

对于列表,这不会有任何区别 - 但是您可以轻松地将上述版本扩展到seqs,并且它产生差异(迭代seq一次或两次):

let avg : float seq -> float = 
   Seq.fold (fun (sum,len) x -> (sum+x,len+1.0)) (0.0,0.0) 
   >> (fun (sum,len) -> sum / len)
Run Code Online (Sandbox Code Playgroud)