Zu der Zeit, als ich zum ersten Mal ernsthaft criticism on -XUndecidableInstances
gelesen hatte, hatte ich mich bereits daran gewöhnt, sah es als nur Beseitigung einer lästigen Einschränkung Haskell98 muss Compiler einfacher zu implementieren machen.Wie kann unentscheidbare Instanzen den Compiler tatsächlich hängen?
In der Tat habe ich viele Anwendungen angetroffen, wo unentscheidbare Instanzen benötigt wurden, aber keine, wo sie tatsächlich irgendwelche Probleme im Zusammenhang mit Unentscheidbarkeit verursacht. Lukes Beispiel ist problematisch, aus einem ganz anderen Grunde
class Group g where
(%) :: g -> g -> g
...
instance Num g => Group g where
...
- na ja, das deutlich überlappt wäre durch eine geeignete Group
Instanz, so Unentscheidbarkeit ist die geringste unserer Sorgen: das ist eigentlich un determinis!
Aber fair genug, ich habe seit "unentscheidbar Instanzen kann den Compiler hängen" in meinem Hinterkopf.
Woher es beschafft wurde, als ich this challenge on CodeGolf.SE las und nach Code fragte, der den Compiler unendlich hängen würde. Klingt wie ein Job für unentscheidbare Instanzen, oder?
Stellt sich heraus, ich kann sie nicht dazu bringen, es zu tun. Die folgende compiliert in kürzester Zeit, zumindest von GHC-7.10:
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
class C y
instance C y => C y
main = return()
ich auch Klassenmethoden verwenden kann, und sie werden dazu führen, nur eine Schleife bei Laufzeit:
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
class C y where y::y
instance C y => C y where y=z
z :: C y=>y; z=y
main = print (y :: Int)
Aber Laufzeit Schleifen sind nichts Ungewöhnliches, Sie können diese einfach in Haskell98 codieren.
Ich habe auch versucht, andere, weniger direkte Schleifen wie
{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}
data A x=A
data B x=B
class C y
instance C (A x) => C (B x)
instance C (B x) => C (A x)
Wieder kein Problem bei der Kompilierung.
Also, was ist eigentlich erforderlich, um den Compiler in der Auflösung von Klassen Instanzen von undecidable Typ aufhängen?
Wahrscheinlich müssen Sie etwas tun, damit der Compiler entscheidet, ob 'Int' eine Instanz von' C' ist. – immibis