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:
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.
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.
Wenn du rein sagst, meinst du wirklich idempotent? Oder meinst du, dass es keine Nebenwirkungen verursacht? –
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. –
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. –