Funktionsanwendung: Warum wird hier $ verwendet?

8

Vor einiger Zeit habe ich ein Frage über $ , und erhielt nützliche Antworten - in der Tat dachte ich, ich verstehe, wie man es benutzt.

Es scheint, ich habe mich geirrt: (

Dieses Beispiel wird in einem Lernprogramm angezeigt:

%Vor%

Ich kann nicht für das Leben von mir sehen, warum $ dort verwendet wurde; ghci hilft mir auch nicht, da sogar Tests, die ich dort mache, eine Gleichwertigkeit mit der Version zeigen, die einfach das $ weglassen würde. Kann jemand das für mich klären?

    
J Cooper 11.01.2009, 20:19
quelle

3 Antworten

11

Das $ wird hier verwendet, weil es eine niedrigere Priorität als die normale Funktionsanwendung hat. Eine andere Möglichkeit, diesen Code zu schreiben, ist wie folgt:

%Vor%

Die Idee ist, zuerst eine Funktion ( concat . map f ) zu konstruieren und sie dann auf ihr Argument anzuwenden ( xs ). Wie gezeigt, kann dies auch getan werden, indem einfach Klammern um den ersten Teil gelegt werden.

Beachten Sie, dass das Weglassen von $ in der ursprünglichen Definition nicht möglich ist, da dies zu einem Typfehler führen wird. Dies liegt daran, dass der Funktionszusammensetzungsoperator ( . ) eine niedrigere Priorität als die normale Funktionsanwendung hat, wodurch der Ausdruck effektiv in:

umgewandelt wird %Vor%

Was nicht sinnvoll ist, weil das zweite Argument des Funktionszusammensetzungsoperators überhaupt keine Funktion ist. Obwohl die folgende Definition sinnvoll ist:

%Vor%

Übrigens ist dies auch die Definition, die ich bevorzugen würde, weil sie mir viel klarer erscheint.

    
Tom Lokhorst 11.01.2009, 21:08
quelle
3

Ich würde gerne erklären, warum das hier nicht der verwendete Stil ist:

%Vor%

concat . map f ist ein Beispiel für das sogenannte Pointfree-Style-Writing; wo pointfree bedeutet "ohne den Punkt der Anwendung". Denken Sie daran, dass wir in der Mathematik im Ausdruck y=f(x) sagen, dass f auf den Punkt x angewendet wird. In den meisten Fällen können Sie einen letzten Schritt tun, indem Sie ersetzen:

%Vor%

mit

%Vor%

wie f = concat . map f , und das ist eigentlich pointfree style. Was klarer ist, ist strittig, aber der pointfree Stil gibt einen anderen Blickwinkel, der auch nützlich ist, also manchmal verwendet wird, selbst wenn nicht genau benötigt.

BEARBEITEN: Ich habe sinnlos durch punktfrei ersetzt und einige Beispiele nach dem Kommentar von Alasdair, dem ich danken sollte, korrigiert.

    
Blaisorblade 11.01.2009 22:43
quelle
1

Der Grund, warum $ hier verwendet wird, ist die Typ-Signatur von (.):

%Vor%

Hier haben wir

%Vor%

und

%Vor%

Also enden wir mit

%Vor%

und der Typ von (.) könnte als

geschrieben werden

(.) :: ([[b]] ​​- & gt; [b]) - & gt; ([a] - & gt; [[b]]) - & gt; [a] - & gt; [b]

Wenn wir concat . map f xs verwenden würden, würden wir das sehen

%Vor%

Und so kann nicht mit (.) verwendet werden. (Der Typ müsste (.) :: (a - & gt; b) - & gt; a - & gt; b

sein     
Axman6 22.01.2009 10:46
quelle