2017-04-23 4 views
2

Wenn ich eine Funktion haben:F # reine Funktionen und currying

let f (myClass : MyClass) x = 
    // do something using the instance of myClass and x 

und ich Curry f dies wie:

let myClass = new MyClass() 
let g = f myClass 

so kann ich

let something = f 42 

rufen Sie einfach ist ga rein Funktion? Oder ist es gefangener Verweis auf die Instanz von MyClass macht es unrein?

Antwort

2

Es hängt davon ab, welche Funktionen (oder Methoden) die Funktion aufruft und ob diese Funktionen (oder Methoden) rein sind oder nicht. Erfasstes Objekt ist völlig irrelevant.

Eine Funktion wird als "rein" betrachtet, wenn sie zwei Bedingungen erfüllt: (1) sie gibt immer das gleiche Ergebnis bei gleichen Argumenten zurück und (2) sie erzeugt keine Nebenwirkungen (wie Dinge wie Eingabe/Ausgabe oder Mutation) Daten). Ob die Funktion irgendwelche in einem Verschluss erfassten Daten hat oder nicht, ist für den Reinheitsbegriff weitgehend irrelevant.

Zum Beispiel würde die folgende Funktion rein sein, auch wenn es ein Objekt in einem Verschluss erfaßt:

let f (c: MyClass) x = if c = null then x else x+1 
let g = f (MyClass()) 

Aber die folgenden Funktionen sind unrein, auch wenn es keine Daten erfassen:

let g1 x = printfn "%d" x 
let g2 x = System.DateTime.Now.Minute + x 

In diesem Beispiel ist unrein, weil es einen Nebeneffekt in der Form der Ausgabe an die Konsole erzeugt; und g2 ist unrein, weil es bei jedem Aufruf ein anderes Ergebnis liefert.

Die ursprüngliche Idee hinter dieser Definition von Reinheit (auch als "referentielle Transparenz" bezeichnet) bestand darin, dass ein Aufruf einer reinen Funktion innerhalb eines Programms durch dessen Ergebnis ersetzt werden kann, ohne die Bedeutung des Programms zu alarmieren. Dies ist wiederum nützlich für alle Arten von Optimierungen und Beweisen.

Zum Beispiel kann jeder Aufruf von g (wie oben definiert), kann sicher mit dem Ergebnis (zum Beispiel mit g 56 ersetzen) ersetzt werden, aber Invokationen von g1 kann nicht, weil das wird das Programm der Konsolenausgabe ändern.