2017-01-11 3 views
3

Проблема не нова в stackoverflow, но я не могу понять поведение привязки let к шаблонам и ключевому слову in. Мой textbook предпочитает формат необычное определение функции:F # let binding patterns

let foo = fun x -> let f = (fun x y -> x +y) in f x  

Так что я перевел в #light синтаксис:

let foo x = 
    let f y = 
     x + y 
    f x 

Если я устанавливаю foo 4 возвращает меня 8. Зачем? Я не могу понять, что на самом деле происходит внутри функции, даже с изящными объяснениями от here. Почему 4 становится аргументом как для x, так и для y?

ответ

7

Вы определяете функцию внутри другой функции, ваша внутренняя функция f захватывает значение из внешней функции, значение x, которое используется в x + y так x становится 4.

Тогда вы называете внутреннюю функцию f x прохождение x к y который также 4.

Другой способ его просмотра, не принимая во внимание конкретные значения 4, ваша внутренняя функция let f y = x + y, но это всегда вызывается с x так y становится x, тогда ваша функция станет чем-то вроде let f a = a + a.

Главное, чтобы понять это, заключается в том, что функция может захватывать значение из контекста, в данном случае x.

Так что это объясняет поведение вашей функции с использованием синтаксиса света, но вам может быть интересно, почему она отличается от версии с одним слоем. Это потому, что перевод неверен. Вот правильный перевод:

let foo x = 
    let f x y = 
     x + y 
    f x 

А теперь, если вы звоните его foo 4 возвращает функцию, ожидать другого параметра.

5

Скажем, мы называем функцию Foo с 4

let foo x = 
    let f y = 
     x + y 
    f x 

foo 4 

Мы можем заменить foo 4 с функцией foo заменяющего все x с 4.

let f y = 
    4 + y 

f 4 

Теперь мы можем заменить f 4 с функцией f с y := 4.

4 + 4 

Что очевидно 8.

Смежные вопросы