Функция без точек не вызовет рекурсию, но нормальная функция будет здесь?

В качестве побочного вопроса здесь Что проще всего способ сделать что-то вроде делегирования многоадресной рассылки в F # Я думаю, может быть, лучше поднять полный вопрос с правильным заголовком.

Эта версия не вызовет рекурсии: (Здесь notify кажется неизменным в d)

let mutable notify = fun x -> x
let wrap f i = f(i); i

let a x = printf "%A" x
let d = (notify >> (wrap a)) // point free
notify <- d

notify "ss"

Эта версия будет. (Здесь notify кажется изменяемым в d)

let mutable notify = fun x -> x
let wrap f i = f(i); i

let a x = printf "%A" x  
let d x =
    (notify >> (wrap a)) x // normal function
notify <- d

notify "ss" // endless loop

Еще одна неудачная версия:

let mutable notify = fun x -> x
let wrap f i = f(i); i

let a x = printf "%A" x  
let d =
    fun x -> (notify >> (wrap a)) x // Here
notify <- d

notify "ss" // endless loop

Где я могу найти какие-либо рекомендации или дополнительные ресурсы, объясняющие, почему у нас такое несоответствие в поведении. Связано ли это с конкретным компилятором/языком или для него существует теория, применимая ко всем функциональным языкам?


person colinfang    schedule 19.07.2013    source источник


Ответы (1)


Причиной такого поведения является неконтролируемая изменчивость. Другие языки, такие как Haskell, обеспечивают контролируемую изменчивость с использованием методов программной памяти транзакций, которые позволяют избежать подобных проблем. Кроме того, нетерпеливая оценка играет здесь важную роль.

let d = (notify >> (wrap a)) : в этом случае любое значение notify будет составлено из (wrap a), а результат будет присвоен d.

let d x = (notify >> (wrap a)) x: здесь тело функции не выполняется до тех пор, пока вы не вызовете функцию d и, следовательно, не получите измененное значение notify.

person Ankur    schedule 19.07.2013