Haskell: Design Pattern: Klassen oder Pass-Funktionen

8

Nehmen wir an, ich habe eine Funktion, die eine Eingabestruktur benötigt und eine Ausgabestruktur zurückgibt (die mit der Eingabestruktur verwandt, aber davon verschieden sein kann).

Ich möchte diese Eingabe- / Ausgabestrukturen nicht für einen bestimmten Typ erzwingen, ich möchte nur sicherstellen, dass sie ein paar Verhaltensweisen haben, die ich brauche.

Sollte ich?

a) Definieren Sie eine Klasse mit den entsprechenden Extraktionsmethoden und erzwingen Sie, dass die Eingabedaten eine Instanz dieser Klasse sind? ODER
b) Lassen Sie die Funktion einen anderen Parameter annehmen, der Funktionen definiert, die definieren, wie man Daten extrahiert.

Auch habe ich die gleiche Frage für die Ausgabestrukturen (außer dieser Zeit ist die erforderliche Funktionalität Mutation)?

    
Clinton 11.07.2012, 00:03
quelle

4 Antworten

10

Wann immer Sie zwischen expliziten Funktionsargumenten und Typklassen wählen müssen, sollten Sie sich diese wichtigste Frage stellen: Sind die Funktionen spezifisch für den Typ oder für die Anwendung? Ein Beispiel für das erstere ist sort , und ein Beispiel für letzteres ist map .

Das Übergeben von Funktionen ist immer flexibler, aber es kann für Ihre Situation übertrieben sein und unnötigen Code-Bloom verursachen. Typklassen hingegen führen zu viel kleinerem Code, sind aber auch weniger flexibel.

Ohne weitere Informationen ist es hier nicht möglich, eine genauere Antwort zu geben.

    
ertes 11.07.2012, 00:55
quelle
3

Kommt darauf an.

Der Vorteil einer Typklasse ist, dass Sie die Funktionen nicht explizit an Hilfsfunktionen übergeben müssen. Wenn Sie also mehr als zwei Funktionen haben oder wenn Sie erwarten, dass viele Funktionen mit denselben grundlegenden Transformationsfunktionen arbeiten, ist wahrscheinlich eine Typklasse besser.

    
Bill 11.07.2012 00:07
quelle
0

"Ich möchte nur sicherstellen, dass sie ein paar Verhaltensweisen haben, die ich brauche." - Das beschreibt ziemlich genau, wozu Typklassen gehören, ich würde damit gehen. Ich bin nicht sicher über die Ausgabestruktur, ich denke eine Funktion muss einen bestimmten Typ zurückgeben, Sie können nicht einen von mehreren Typen zurückgeben, auch wenn sie Instanzen derselben Typklasse sind.

    
millimoose 11.07.2012 00:09
quelle
0

Eine Typklasse bietet eine eindeutige Zuordnung von Typen zu Funktionen. Daher sollten Sie sich fragen, ob Sie für einen Typ immer die gleichen Funktionen benötigen. Zum Beispiel , wenn Sie einen Vektor an eine Funktion übergeben und Ihre Funktion eine Norm für den Vektor benötigt, ist es normalerweise keine gute Idee, Typklassen zu verwenden, da es viele nützliche Normen gibt. In diesem Fall ist ein Funktionsparameter vorzuziehen.

    
tkx68 19.07.2012 07:26
quelle

Tags und Links