Ich versuche, Ausdrücke mit Typfamilien darzustellen, aber ich kann nicht herausfinden, wie ich die Einschränkungen schreiben soll, die ich möchte, und ich fange an zu glauben, dass es einfach nicht möglich ist. Hier ist mein Code:Haskell-Typ Familieninstanz mit Typbeschränkungen
class Evaluable c where
type Return c :: *
evaluate :: c -> Return c
data Negate n = Negate n
instance (Evaluable n, Return n ~ Int) => Evaluable (Negate n) where
type Return (Negate n) = Return n
evaluate (Negate n) = negate (evaluate n)
Das alles kompiliert gut, aber es drückt nicht genau das aus, was ich will. In den Einschränkungen der Negate
Instanz von Evaluable
, sage ich, dass der Rückgabetyp des Ausdrucks innerhalb Negate
ein Int
(mit Return n ~ Int
) sein muss, so dass ich darauf negieren kann, aber das ist zu restriktiv. Der Rückgabetyp muss eigentlich nur eine Instanz der Num
Typklasse sein, die die negate
Funktion hat. Auf diese Weise Double
s, Integer
s oder jede andere Instanz von Num
könnte auch negiert werden und nicht nur Int
s. Aber ich kann nicht nur schreiben
Return n ~ Num
statt, weil Num
eine Typklasse und Return n
ist ein Typ. Ich kann auch nicht setzen
Num (Return n)
statt, weil Return n
ein Typ ist kein Typ Variable.
Was versuche ich mit Haskell überhaupt noch zu erreichen? Wenn nicht, sollte es sein, oder verkenne ich eine Theorie dahinter? Ich habe das Gefühl, dass Java eine Einschränkung wie diese hinzufügen könnte. Lassen Sie mich wissen, ob diese Frage klarer sein könnte.
Edit: Danke Jungs, die Antworten helfen und bekommen, was ich vermutete. Es scheint, dass der Typ-Checker nicht in der Lage ist, mit dem, was ich ohne UndecidableInstances machen möchte, fertig zu werden, also ist meine Frage, möchte ich wirklich unentscheidbar ausdrücken? Es ist für den Haskell-Compiler, aber ist es überhaupt? h., könnte eine Einschränkung sogar existieren, die bedeutet "überprüfe, dass Return n eine Instanz von Num ist", die zu einem fortgeschritteneren Typ-Checker entscheidbar ist?
BTW, hat GHC niemals eine Spracherweiterung empfohlen, wie zB 'FlexibleContexte' oder etwas anderes, während Ihres Versuchs- und Fehlerprozesses? weil ich ganz sicher bin - nur eine Randnotiz auf dem _ "ist das sogar möglich mit Haskell" _ Bit. –