2014-02-02 2 views
0

Как преобразовать float в float. Вот функция:Преобразование 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, и я не знаю, как это сделать. Я думал, что если я вернусь с плавающей точкой в ​​функции опции поплавка он будет автоматически возвращать вариант с плавающей точкой, но я получаю следующее сообщение об ошибке:

Error: This expression has type float but an expression was expected of type float option

Я попробовал оборачивать его вокруг Some и не удалось. Кажется, что не нашел ничего в Интернете.

EDIT: Добавлен полный код

ответ

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) 
Смежные вопросы