Kann man (zur Kompilierzeit) wissen, welche Instanz der Compiler im Falle einer überlappenden Instanz auswählt?Gibt es eine Möglichkeit, die überlappende Instanzentscheidung zu verfolgen?
konstruiertes Beispiel,
{-# LANGUAGE IncoherentInstances #-}
class Transformable a b where
transform :: a -> b
instance Transformable a Int where
transform _ = 17
instance a ~ b => Transformable a b where
transform x = x
Was ist das Ergebnis von tranform (1:: Int) :: Int
? (1 oder 17) Gibt es eine Möglichkeit zu wissen, wann Instanziierung Transformable Int Int
, wenn der Compiler Instanz 1 oder Instanz 2 scho? Es ist auch manchmal nützlich, wenn es keine Überlappung gibt, aber die Kette der Instanziierung ist kompliziert.
Blick auf die GHC-Core. Verwenden Sie '-ddump-simpl 'und suchen Sie nach den Wörterbuchargumenten. – chi
Ich bin neugierig. Was sind die Unterschiede zwischen 'a ~ b => Transformable a b' und' Transformable a a'? –
Ich bin mir nicht sicher, ob ich es in diesem Fall brauche. Ich habe meinen Code vereinfacht, der es brauchte. Da gibt es eine großartige Erklärung [http://chrisdone.com/posts/haskell-constraint-trick] – mb14