Was ist die genaue Definition der reinen Funktion in Scala? Pure Funktion hat eine Definition, auf Wiki https://en.wikipedia.org/wiki/Pure_function. Ich denke, diese Definition ist für eine reine funktionale Programmiersprache.Pure-Funktion in Scala im Zusammenhang mit Klassenmethoden und Verschlüsse
Aber ich denke, es wird im Zusammenhang mit Klassenmethode und Schließung kompliziert.
class Ave(val a: Int, val b: Int) {
def ave = (a+b)/2
}
Ist eine reine Funktion? Ich denke es ist, weil es keine Nebenwirkung hat und es nur vom unveränderlichen Zustand der Klasse abhängt. Dies verletzt jedoch die reine Funktionsdefinition im Wiki, die besagt, dass die reine Funktion generell nicht auf nicht-lokale Variablen zugreifen soll.
ähnliche Frage auf Schließung:
def fcn(a:Int, b: Int): Unit = {
def ave = (a+b)/2
}
Für uns sind beid ave reine Funktion und entsprechen eine "val" (Unified Access-Prinzip).
Aber wie rigoros zu rechtfertigen? Wenn die Felder a und b veränderbar sind, ist ave nicht mehr rein funktional.
class Ave2(var a: Int, var b: Int) {
def ave = (a+b)/2 // Not pure functional
}
Eine andere Definition der reinen Funktion von "Funktionsprogrammierung in Scala" Buch kommen:
Ein Ausdruck e referentiell transparent ist, kann, wenn für alle Programme p, alle Vorkommen von e in p sein ersetzt durch das Ergebnis der Auswertung e ohne die Bedeutung von p zu beeinflussen. Eine Funktion f ist reiner, wenn das Ausdruck f (x) für alle referenziell transparent x
dann ist die Frage referenziell transparent ist, für eine Klasse ist ein veränderlicher Zustand in einer Klasse referenziell transparent (var a, var b in meinem Beispiel)? (Wenn ja, wird die Ave-Methode in Ave2 zur reinen Funktion, die ein Widerspruch ist)
Was ist die genaue Definition einer reinen Funktion in Scala?
Danke für die Antwort! Ich denke, das spricht von der Schließung Teil, was ist mit der Methode, wie die Klasse Ave oben? Gilt die gleiche Regel? Hat Haskell das Konzept von Klasse und Methode? – szli
Ja, das Gleiche gilt. Warum nicht? In diesem Fall ist 'ave' eine Methode, keine Funktion, daher kann nicht erwartet werden, dass sie dieselben Ergebnisse liefert, wenn sie auf verschiedenen Objekten aufgerufen wird. Aber Aufrufe desselben Objekts führen immer zum selben Ergebnis. Was die Haskell betrifft, nein, es gibt dort keine klassischen OOP-Konzepte. Es gibt Typklassen, aber das ist etwas anderes (zwischenzeitlich können Sie auch Typklassen in Scala mit parametrisierten Eigenschaften und impliziten Implementierungen für verschiedene Typen modellieren, aber das ist off-topic). – slouc