Definition reduzierter Partialfunktionen

8

Manchmal habe ich es in Clojure als bequem empfunden, reduzierte Versionen von Funktionen zu definieren, die eine Teilfunktion zurückgeben, z. B.

%Vor%

Dies bedeutet, dass Sie beides tun können:

%Vor%

Dies scheint ziemlich haskellisch zu sein und vermeidet die Notwendigkeit von partial , um Teilfunktionen zu erzeugen.

Aber wird es in Lisp als guter Codierungsstil / API-Design angesehen?

    
mikera 21.05.2012, 02:07
quelle

3 Antworten

7

In Sprachen, in denen standardmäßig Funktionen curirt sind, werden die Funktionsaufrufe ebenfalls curiert. Wenn man schreibt (f a b c) , interpretiert die Sprache dies als (((f a) b) c) . Dies ist in Clojure nicht der Fall.

Ich glaube, dass das Erstellen von Curry-Funktionen in einer Umgebung, in der Calls nicht standardmäßig curiert werden, eine konzeptuelle Diskrepanz verursacht - dieses Konstrukt wird wahrscheinlich Leser verwirren (ich meine menschliche Leser Ihres Codes).

Wenn Ihre Funktion mehr als 2 Argumente hat, wird die Definition schnell hässlich. Angenommen, eine Funktion hat 4 Argumente. Um den currying-Aufruf vollständig zu emulieren, müssen Sie Fälle wie ((f a b) c d) behandeln, wenn jemand zuerst zwei Argumente übergibt und dann die verbleibenden zwei. In diesem Fall muss die überladene Version der Zwei-Argument-Funktion eine überladene Funktion zurückgeben, die sich je nachdem, ob sie 1 oder 2 Argumente erhält, unterschiedlich verhält. Ich denke, es ist möglich, das mit Makros zu automatisieren, aber immer noch.

Sie haben außerdem die Möglichkeit, Standardargumente und das & rest -Konstrukt zu definieren.

    
Rafał Dowgird 21.05.2012, 08:45
quelle
9

Die Verwendung von partial zum Erstellen einer Curry-Funktion basiert auf dem Konzept von Explizit ist besser (in den meisten Fällen :)). Und ich habe festgestellt, dass dieses Konzept in dynamisch typisierten Sprachen wie Clojure, Python usw. besser anwendbar ist / verwendet werden kann, weil die fehlende Typ-Signatur / statische Typisierung mehr Sinn macht, um Dinge explizit zu machen.

    
Ankur 21.05.2012 04:04
quelle
6

hmmm ... persönlich würde ich lieber partial sehen, da das klar macht, was vor sich geht.

Ich weiß nicht, ob es "gut" oder "schlecht" ist, aber ich habe diesen Stil noch nie zuvor in Clojure Code gesehen und kann mir vorstellen, dass Leute, die eine API benutzen, sowohl (prefix "foo" 78979) als auch% erwarten co_de%, um die gleiche Art von Objekt zurückzugeben.

Um den Unterschied zwischen beiden Funktionen zu verdeutlichen, können Sie stattdessen Folgendes tun:

%Vor%     
Gert 21.05.2012 02:28
quelle