用 list.fold 求平均值
finding average with list.fold
只是想做一个非常简单的平均值 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];;
输出为11.2
我需要在函数中添加一些东西,可以将 11.2
除以 x
个元素来求平均值。
有什么帮助吗?
如果你只想迭代列表一次,你可以并行计算它的长度(使用元组“(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)
喜欢的话可以写成无点式的:
let avg =
List.fold (fun (sum,len) x -> (sum+x,len+1.0)) (0.0,0.0)
>> (fun (sum,len) -> sum / len)
这给你:
> avg [1.0;2.0;3.0];;
val it : float = 2.0
当然,扩展函数的最简单方法就是获取列表的长度并除以它:
let avg ls =
List.fold (fun acc float -> acc + float) 0.0 ls / (float ls.Length)
对于列表,这不会有任何区别 - 但您可以轻松地将上述版本扩展到 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)
只是想做一个非常简单的平均值 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];;
输出为11.2
我需要在函数中添加一些东西,可以将 11.2
除以 x
个元素来求平均值。
有什么帮助吗?
如果你只想迭代列表一次,你可以并行计算它的长度(使用元组“(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)
喜欢的话可以写成无点式的:
let avg =
List.fold (fun (sum,len) x -> (sum+x,len+1.0)) (0.0,0.0)
>> (fun (sum,len) -> sum / len)
这给你:
> avg [1.0;2.0;3.0];;
val it : float = 2.0
当然,扩展函数的最简单方法就是获取列表的长度并除以它:
let avg ls =
List.fold (fun acc float -> acc + float) 0.0 ls / (float ls.Length)
对于列表,这不会有任何区别 - 但您可以轻松地将上述版本扩展到 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)