Funktionszusammensetzung

8

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.

%Vor%

Hier sind ein paar einfache Func -Werte, die zusammengesetzt werden können:

%Vor%

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:

%Vor%

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?

    
dharmatech 03.01.2012, 23:07
quelle

1 Antwort

10

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.

JaredPar 03.01.2012, 23:46
quelle

Tags und Links