Разыменование ссылки внутри функции дает разные результаты. Почему?

#f#

#f#

Вопрос:

В этом примере get_final_answer с нетерпением оценивается и всегда возвращает 0.0. Я думал, что выражения, содержащие ссылки, обрабатывались по-разному (и в данном случае не оценивались с готовностью) из-за их неотъемлемо изменяемых характеристик. Я ожидал, что он вернет 7.0.

 let FinalAnswer = ref 0.0
let get_final_answer = !FinalAnswer

let rec eval_expr_fail =
        FinalAnswer := 7.0
        get_final_answer        // fails, returns 0.0

let rec eval_expr_works =
        FinalAnswer := 7.0
        !FinalAnswer           // works, return 7.0
  

Как мне разыменовать FinalAnswer за пределами блока, где я его обновил?

Ответ №1:

get_final_answer in let get_final_answer = !FinalAnswer — это значение с плавающей запятой, а не функция. Это значение равно 0.0 и не имеет ничего общего с FinalAnswer тем, как только значение присвоено.

Преобразование ее в функцию дает то, что вы хотите:

 let FinalAnswer = ref 0.0
let get_final_answer() = !FinalAnswer

let rec eval_expr_fail =
        FinalAnswer := 7.0
        get_final_answer ()       //  returns 7.0
  

Комментарии:

1. Функции тоже являются значениями! Вы имеете в виду «является float, а не функцией».