Unterhalb einer Compose
-Funktion. Wenn f
und g
unäre Funktionen sind, die Werte zurückgeben, gibt Compose(f,g)
eine Funktion zurück, die bei Aufruf von x
das Äquivalent zu f(g(x))
ausführt.
Hier sind ein paar einfache Func
-Werte, die zusammengesetzt werden können:
z. das funktioniert:
%Vor%Wenn ich stattdessen diese äquivalenten statischen Methoden habe:
%Vor%das gleiche Beispiel funktioniert nicht mit diesen. I.e. Dies erzeugt einen Kompilierzeitfehler:
%Vor% Das explizite Übergeben von Typen an Compose
behebt das Problem:
Gibt es trotzdem so Compose
zu schreiben, dass es auf den statischen Methoden ohne die expliziten Typen funktioniert?
Ist dies ein guter Ansatz, um Compose
zu implementieren? Kann jemand das verbessern?
Das Problem ist hier nicht die Verwendung von static
-Methoden, sondern die Verwendung von Methodengruppen. Wenn Sie einen Funktionsnamen als Ausdruck verwenden, ohne ihn aufzurufen, handelt es sich um eine Methodengruppe, die die Methodengruppenumwandlung durchlaufen muss. Sie hätten genau das gleiche Problem mit Instanzmethoden.
Das Problem, auf das Sie stoßen, ist, dass C # keine Rückschlüsse auf Methodengruppen liefern kann. Die Verwendung von Compose(IsZero, ModBy2))
erfordert, dass der Rückgabetyp sowohl für IsZero
als auch für ModBy2
abgeleitet wird und daher diese Operation fehlschlägt.
Dies ist eine bekannte Einschränkung in den Inferenzfunktionen des C # -Compilers. Eric Lippert hat einen ausführlichen Blogartikel zu diesem Thema geschrieben, der dieses Problem im Detail behandelt.
Tags und Links c# functional-programming