#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, а не функцией».