2016-05-30 6 views
2

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.

+1

Blick auf die GHC-Core. Verwenden Sie '-ddump-simpl 'und suchen Sie nach den Wörterbuchargumenten. – chi

+1

Ich bin neugierig. Was sind die Unterschiede zwischen 'a ~ b => Transformable a b' und' Transformable a a'? –

+0

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

Antwort

1

Sie können immer Debug.Trace verwenden:

import Debug.Trace 
... 

instance Transformable a Int where 
    transform _ = trace "using Int definition" 17 

instance a ~ b => Transformable a b where 
    transform x = trace "using a ~ b definition" x 
+1

Das OP fragt: "Ist es möglich zu wissen, __ (zur Kompilierzeit) __..." – chi

+0

Ich tat das und es ist in der Tat. Aber ich bin interessiert zu wissen, ob es zur Kompilierungszeit eine magische Flagge gibt. + 1 auf jeden Fall – mb14