| + | ist eine Halbgruppe, weshalb sie eine implizite monoidale Auflösung benötigt

8

Das Ziel von Semigroup ist es, die Assoziativität und die Schließung sicherzustellen Das Ziel von monoid basiert auf Semigroup und bietet zusätzliche Identität. Wenn ich | + | Semigroup-Appender, warum habe ich implizite Monoid nicht implizite Semigruppe definiert

Hier ist der Code, den ich reduceLeft benutze, der den Anfangswert nicht benötigt

%Vor%

Wenn staffListSemigroup Semigroup [Liste [Mitarbeiter]] ist, ist der Kompilierungsfehler der Wert | + | ist kein Mitglied von List [SemigroupSpec.this.Staff]

Auch die Definition von | + | ist in der Semigruppe

%Vor%

Vielen Dank im Voraus

Bearbeiten

gefolgt von @ Travis Antwort, ich denke nicht, dass es korrekt ist. Für den impliziten Wert überschreibt der spezifische Wert immer den generischen Wert. Hier ist ein Codebeispiel, das ich gerade geschrieben habe:

%Vor%

Ist das so, weil in der Scalaz kein in der Methode wie Foo angegebener Typ angegeben ist.

    
Cloud tech 24.08.2014, 02:06
quelle

1 Antwort

8

Das Problem ist, dass es für Semigroup bereits ein List[A] für A gibt. Sie haben eine spezifischere Instanz für List[Staff] definiert, was zu einer Mehrdeutigkeit führt, wie Sie sehen können, wenn Sie nach der Instanz fragen:

%Vor%

Sie könnten durch einige Ringe springen und versuchen, die von Scalaz bereitgestellte Instanz außerhalb des Gültigkeitsbereichs zu belassen, aber bitte nicht! -es ist möglicherweise sehr verwirrend für andere Benutzer und ist eine Verletzung von einige grundlegende gute Prinzipien für das Arbeiten mit Typklassen . Stattdessen können Sie einen Wrapper für List[Staff] schreiben (was eine einfache Fallklasse tun würde) und dann eine Instanz für diesen Typ bereitstellen.

Der Vollständigkeit halber sei darauf hingewiesen, dass die Version mit Monoid kompiliert, weil Monoid spezifischer ist als Semigroup (siehe Abschnitt 6.26.3 von Sprachspezifikation für die Regeln, die hier gelten, aber seien Sie gewarnt, dass sie irgendwie unordentlich sind).

    
Travis Brown 24.08.2014, 12:39
quelle