verwendet werden Betrachten Sie den folgenden CodeGADT Typargument für typeclass Auflösung nicht
data Foo f where
Foo :: Foo Int
class DynFoo t where
dynFoo :: Foo f -> Foo t
instance DynFoo Int where
dynFoo Foo = Foo
obsFoo :: (DynFoo t) => Foo f -> Foo t
obsFoo = dynFoo
useDynFoo :: Foo f -> Int
useDynFoo (obsFoo -> Foo) = 1
Das Muster Spiel in useDynFoo
sollte die Verwendung von obsFoo
beschränken haben Typ Foo f -> Foo Int
, die es für eine Instanz von DynFoo Int
zu suchen führen sollte . Es sucht jedoch stattdessen nach einer Instanz DynFoo t
für unbekannte t
, und natürlich schlägt fehl.
No instance for (DynFoo t0) arising from a use of ‘obsFoo’
The type variable ‘t0’ is ambiguous
Wenn ich jedoch die Definition von useDynFoo
zu
useDynFoo :: Foo f -> Int
useDynFoo (obsFoo -> (Foo :: Foo Int)) = 1
Dann funktioniert es plötzlich ändern, auch wenn meine Art Signatur völlig überflüssig ist.
Warum passiert das und wie kann ich obsFoo
verwenden, ohne eine Typ-Signatur geben zu müssen?
Dies ist eine Link-only-Antwort, die erweitert werden sollte. Gerade jetzt erklärt es nicht viel. – chi
Sie sollten es auch vermeiden, auf "aktuell" zu verweisen, indem Sie eine bestimmte Dokumentationsversion bevorzugen. – dfeuer