Я потерян в следующем примере на стр. 106 из книги под названием «Разработка приложений с объективным верблюдом».
let nil_assoc = function x -> raise Not found ; ;
let l = ref nil_assoc;;
let add_assoc_again (k,v) l = l := (function x -> if x=k then v else !l x) ; ;
add_assoc_again ('1',1) l ; ;
add_assoc_again ('2',2) l ; ;
Результирующее значение для l является функцией, которая указывает на себя и, следовательно, выполняет цикл.
Я бы подумал, что значение для l после add_assoc_again ('1', 1) l ;;
является функцией
x -> if x = '1' then 1 else nil_assoc x;;
В продолжение, результирующее значение для l после add_assoc_again ('2', 2) l ;;
должно быть функцией
x -> if x ='2' then 2 else ( function x -> if x = '1' then 1 else nil_assoc x ) x;;
Я не понимаю, почему результирующее значение для l является функцией, которая указывает на себя, и поэтомупрограмма зависает и зацикливается