将float转换为float选项

时间:2014-02-02 09:53:13

标签: ocaml

如何将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附近并失败了。似乎无法在互联网上找到任何东西。

编辑:添加完整代码

1 个答案:

答案 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)