2013-04-08 15 views
7

Angenommen, ich habe diese beiden # Funktionen F:Wie erkennt man, ob eine F # -Funktion rein ist?

let sq x = x*x 

let tm = DateTime.Now 

Offensichtlich ist in reiner sq, dass es immer den gleichen Wert für eine gegebene Eingabe zurückzukehren, während tm unrein ist, weil es es einen anderen Wert jedes Mal zurückkehren wird aufgerufen .

Im Allgemeinen gibt es eine Möglichkeit zu bestimmen, ob eine bestimmte Funktion in F # rein oder unrein ist, ohne zu analysieren, was es tut, mit anderen Worten Zeile für Zeile lesen?

Alternativ gibt es eine Möglichkeit, eine Funktion mit Anmerkungen zu versehen, um dem Compiler mitzuteilen, dass die Funktion beim Schreiben rein oder unrein ist.

Schließlich, wenn eine Funktion, die Teil der Common Language Runtime (wie DateTime) ist, wie kann man sagen, ob es rein oder unrein ist, ohne es zu versuchen?

Hinweis: von "reinen" ich die Definition von Wikipedia bedeuten: http://en.wikipedia.org/wiki/Pure_function (permalink)

In Computer-Programmierung, eine Funktion als reines beschrieben werden, wenn beide diese Aussagen über die Funktion halten:

  1. Die Funktion wertet immer den gleichen Ergebniswert bei demselben Argument Wert (e) aus. Der Funktionsergebniswert kann nicht von verdeckten Informationen oder einem Zustand abhängen, der sich ändern kann, wenn die Programmausführung oder zwischen verschiedenen Ausführungen des Programms abläuft, noch kann er von externen Eingängen von E/A-Geräten abhängig sein.

  2. Beurteilung des Ergebnisses verursacht keine beobachtbare Seite semantisch Wirkung oder Leistung, wie die Mutation von veränderbaren Objekten oder Ausgabe an den E/A-Geräte.

+1

Wenn du rein sagst, meinst du wirklich idempotent? Oder meinst du, dass es keine Nebenwirkungen verursacht? –

+1

Ah, so sagt Wikipedia beides. Meinetwegen.FWIW, ich denke nicht, dass Microsoft irgendeine Art von Annotation oder Attribut anbietet, das Funktionen als "rein ..." kennzeichnet. Sie müssen es nur wissen. –

+0

Sie könnten auch die Antworten auf diese Frage finden http://stackoverflow.com/questions/4391524/is-returning-a-rand-value-from-function-a-side-effect lohnenswert zu lesen. –

Antwort

9

F # bietet keine Funktionen und Tools für die Kontrolle der Methoden sind rein, so dass eine einfache Antwort ist, dass Sie diese Eigenschaft selbst zu überprüfen.

Außerhalb von F #, es ist erwähnenswert, dass Code Contracts Bibliothek eine Vorstellung von reinen Methoden hat (und sie können mit PureAttribute markiert werden), aber ich bin mir nicht ganz sicher, was ist die Überprüfung Geschichte dort. Ich denke, dass Code Contracts mit einem statischen Checker ausgestattet sind, der IL analysiert (und auch für F # funktionieren sollte), aber das ist eine ziemlich schwierige Aufgabe, also würde ich erwarten, dass es ziemlich begrenzt ist. Bei einigen BCL-Methoden wird jedoch die PureAttribute verwendet, sodass Sie feststellen können, dass einige .NET-Standardmethoden rein sind.

+5

'PureAttribute' ist nur eine Möglichkeit, Code Contracts mitzuteilen, dass die Funktion rein ist - keine Analyse (Laufzeit oder statisch) wird ausgeführt – AlexFoxGill

+3

Leider Code Contracts [still] (http://social.msdn.microsoft.com/Forums/ en-US/11b8c5e3-a25d-4770-a46d-14f24921e0a0/f-und-code-verträge? forum = codecontracts) [nicht] (http://social.msdn.microsoft.com/Forums/en-US/ 7830b49c-ff45-4105-8609-1e2f8b81263d/wann-werde-f-unterstützt? Forum = codecontracts) arbeite mit F #. –

1

Technisch gesehen ist Ihr 'tm' Wert keine Funktion, sondern ein Wert vom Typ DateTime und er ist unveränderlich, so dass jedes Mal, wenn Sie diesen Wert nach der Erstellung auswerten, immer derselbe sein wird.

+2

... und um noch weiter zu klären, wenn Sie sagten let tm() = DateTime.Now (beachten Sie die zusätzlichen Klammern) würden Sie es zu einer Funktion, die wahrscheinlich Ihre Absicht war. – Kit

0

Da es möglich ist, sowohl reine als auch reine Funktionen in f # zu definieren, wäre ich sehr überrascht, wenn es einen Algorithmus gäbe, der f # -Code (Funktionsdefinitionen) auf Reinheit prüfen könnte - Programmcode für semantische Eigenschaften ist allgemein unentscheidbar durch den Satz von Rice.

Verwandte Themen