Können Sie eine Instanz einer Klasse nicht für einen Typ, sondern für eine ganze Klasse in Haskell erstellen?

8

Angenommen, ich möchte alle Zahlen zu einer Instanz von Monoid machen. Anstatt für jedes Num eine Instanz wie folgt erstellen zu müssen:

%Vor%

Gibt es so etwas?

%Vor%

Bearbeiten

Einige antworten mit GHC-Erweiterungen und warnen vor möglichen Problemen. Ich fand das informativ, aber ich denke, ich werde bei Sum , Product und was auch immer coerce tun.

    
Lay González 24.09.2015, 19:10
quelle

2 Antworten

21

Ich interpretiere das so, als würde ich nach einer allgemeinen Prämisse fragen und nicht speziell nach Monoid und Num .

Vielleicht könnten Sie das, was Sie geschrieben haben, zum Laufen bringen, indem Sie die Spracherweiterungen FlexibleInstances, UndecidableInstances und die Verwendung überlappender Instanzen aktivieren.

Aber Sie würden wahrscheinlich nicht wollen: es scheint wie instance Num t => Monoid t where ... sagt

"Wenn t eine Instanz von Num ist, können Sie wie folgt t eine Instanz von Monoid ..."

machen

Leider stimmt das nicht. Was es eigentlich sagt, ist mehr wie

"So erstellen Sie t eine Instanz von Monoid. Zuerst muss t eine Instanz von Num sein. Weiter ..."

Wenn Sie also eine Instanzdeklaration schreiben, können Sie keine anderen Instanzdeklarationen schreiben. (Zumindest nicht ohne OverlappingInstances , das würde seine eigenen Probleme bringen.)

    
Mike Benfield 24.09.2015, 19:43
quelle
6

GHC ermöglicht Ihre Definition mit einigen aktivierten Spracherweiterungen

%Vor%

Dies macht 2 <> 3 Ergebnis in 5 .

Aber Dies überschneidet sich mit anderen Monoid -Instanzen und versucht daher, "Hello" <> "World" -Ergebnisse mit einem Fehler zu bewerten: Overlapping instances for Monoid [Char]

Also, ich denke, dass die kurze Antwort lautet: Nein.

    
yairchu 24.09.2015 19:44
quelle