Wenn ich einen Datentyp wie folgt in Haskell haben:Constraint Arten: Pass mehrere Einschränkungen
data A ctx = A (forall a. ctx a => a -> a)
Dann kann ich Funktionen setzen, die in diesem Datentyp auf Werte von Fahrzeugtypen einer bestimmten Klasse arbeiten:
> A (+3) :: A Num
A (+3) :: A Num :: A Num
Aber ist es auch möglich, Funktionen mit mehreren Einschränkungen in diesen Datentyp zu setzen? Ich habe das versucht:
> :t ((+ 3) . succ)
((+ 3) . succ) :: (Enum c, Num c) => c -> c
> :t A ((+ 3) . succ) :: A (Enum,Num)
Expecting one more argument to `Enum'
In an expression type signature: A (Enum, Num)
In the expression: A ((+ 3) . succ) :: A (Enum, Num)
Also das funktioniert nicht. Wie ist es möglich zu tun, was ich will, oder ist es unmöglich? Ich weiß, eine Lösung wäre die Verwendung eines "Dummy" -Datentyps und einer Typfamilie, aber das möchte ich nicht, wenn es wegen seiner Komplexität einen anderen Weg gibt. Außerdem könnte ich in diesem Beispiel einfach (+1) anstelle von succ verwendet haben, aber es gibt komplexere Fälle, in denen eine solche Umwandlung in nur eine Klasse nicht möglich ist.
Was noch typeclass wie 'Klasse (Num a, Enum a) => Foo a' definieren? – thoferon
Ja, das würde natürlich auch funktionieren, aber ich mag es nicht, eine Typklasse zu machen, nur um zwei Kontexte zu kombinieren – bennofs