Nein, das wäre nicht möglich.
Zum Beispiel
%Vor%ist die gleiche Funktion wie
%Vor% und referenzielle Transparenz erfordern, dass equals durch equals ersetzt werden können. Wenn also compositionSplit
möglich wäre, würde
f1
und f2
erzeugen, da dies die gleiche Funktion ist, aber compositionSplit f1 = ((+ 1), (+1))
und compositionSplit f2 = (subtract 1, (+ 3))
wären für die Angabe von compositionSplit
erforderlich. Es könnte . In der streng interpretatorischen nicht kompilierten Implementierung könnten Sie Funktionen als
darstellen %Vor%und dann definieren Sie einfach
%Vor%Eine solche Implementierung würde die Funktionsgleichheit (in Bezug auf referentielle Transparenz) als intentional behandeln, nicht erweiterte Gleichheit. Da die Sprache selbst nichts über die Gleichheit der Funktionen AFAIK sagt, sollte dies nichts (außer vielleicht Leistung) beeinflussen.
In kompilierten Implementierungen könnte dies auch erreicht werden, z. indem Provenance für jedes Objekt im Speicher beibehalten wird.
AndrewC gibt ein gewinnendes Gegenargument: Wenn wir die beiden Werte a=f.(g.h)
und b=(f.g).h
als gleiche Werte betrachten wollen - was wir normalerweise in Haskell tun -, wird fst.unJust.deCompo
zwei verschiedene Ergebnisse liefern, referentielle Transparenz brechen. Es kann also nicht Teil des reinen FP-Paradigmas sein. Es müsste etwas zurückgeben, was wir in beiden Fällen auch als gleichwertig betrachten könnten, und wir würden es nicht auseinander nehmen können, ohne die Reinheit zu brechen. Vielleicht könnte so etwas in einer unreinen Monade existieren, aber das ist nicht das, wonach OP leider gefragt hat. :) Also diese Antwort ist falsch.
Tags und Links haskell function-composition