2017-01-11 1 views
3

Das Problem ist nicht neu in stackoverflow, aber ich bin nicht in der Lage, das Verhalten der let Bindung mit Mustern und der in Schlüsselwort zu verstehen. Mein textbook zieht das seltene Funktion Definition-Format:F # lassen Bindungsmuster

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

Damit ich in #light Syntax übersetzt:

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

Wenn ich foo 4 gesetzt es gibt mir 8. Warum? Ich kann nicht verstehen, was tatsächlich in der Funktion passiert, sogar mit den eleganten Erklärungen von here. Warum 4 wird Argument für beide x und y?

Antwort

7

Sie eine Funktion innerhalb einer anderen Funktion definieren, Ihre innere Funktion f einen Wert aus der äußeren Funktion erfasst, x der Wert, der in x + y verwendet wird, so wird x 4.

Dann rufen Sie die Weitergabe innere Funktion f xx-y die auch 4.

Eine andere Möglichkeit, es zu betrachten, ohne den spezifischen Wert in Anbetracht 4, Ihre innere Funktion ist let f y = x + y aber es ist immer mit x sogenanntwird x, dann wird Ihre Funktion etwa wie let f a = a + a.

Der Schlüssel zum Verständnis ist, dass eine Funktion einen Wert aus dem Kontext erfassen kann, in diesem Fall x.

Das erklärt also das Verhalten Ihrer Funktion mit der Lichtsyntax, aber Sie fragen sich vielleicht, warum es sich von der Einzeiler-Version unterscheidet. Es liegt daran, dass die Übersetzung falsch ist. Hier ist die richtige Übersetzung:

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

Und jetzt, wenn Sie es mit foo 4 Aufruf gibt es eine Funktion, die die anderen Parameter erwarten.

5

Sagen wir die Funktion foo mit 4.

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

foo 4 

Wir sind mit der Funktion mit der x alle ersetzen kann foo ersetzen foo 4 rufen 4.

let f y = 
    4 + y 

f 4 

Jetzt können wir f 4 mit der Funktion ersetzen f mit y := 4.

4 + 4 

die offensichtlich 8.

ist