如何将float转换为float选项。这是功能:
let variance (list_ : float list) : float option =
if List.length list_ < 2 then None
else begin
let average tmp_list = List.fold_left(+.) 0. tmp_list /. float(List.length tmp_list) in
let square value = value *. value in
let rec sum tmp_list =
match tmp_list with
| [] -> 0.0
| head::tail -> square (head -. average tmp_list) +. sum tail
in Some (sum list_ /. float(List.length list_))
end
我需要sum list_ /. float(List.length list_)
返回float option
而不是float
,我不知道该怎么做。我想如果我在float选项函数中返回float它会自动返回float选项但是我得到以下错误:
错误:此表达式的类型为float,但需要表达式 类型为浮动选项
我试过将它包裹在Some
附近并失败了。似乎无法在互联网上找到任何东西。
编辑:添加完整代码
答案 0 :(得分:2)
您的代码运行,它只是给出了错误的答案。那是因为你sum
函数不正确:你应该总是使用整个列表的平均值,而你使用当前元素的平均值。
let variance l =
let sum l = List.fold_left (+.) 0. l in
let average l =
match List.length l with
0 -> None
| n -> Some (sum l /. float_of_int n) in
match average l with
None -> None
| Some m -> average (List.map (fun x -> (x -. m)**2.) l)