Implement Refl in deriveNT
authorJoachim Breitner <mail@joachim-breitner.de>
Thu, 4 Jul 2013 12:31:08 +0000 (14:31 +0200)
committerJoachim Breitner <mail@joachim-breitner.de>
Thu, 4 Jul 2013 12:31:08 +0000 (14:31 +0200)
GHC/NT/Plugin.hs
test.hs

index c2c236c..e20674b 100644 (file)
@@ -173,6 +173,8 @@ findCoercion t1 t2 = find go
 -- between them
 deriveNT :: TyCon -> [Coercion] -> Type -> Type -> CoreM Coercion
 deriveNT nttc cos t1 t2
+    | t1 `eqType` t2 = do
+        return $ Refl t1
     | Just (tc1,tyArgs1) <- splitTyConApp_maybe t1,
       Just (tc2,tyArgs2) <- splitTyConApp_maybe t2,
       tc1 == tc2 = do
diff --git a/test.hs b/test.hs
index 0798f54..57cb43d 100644 (file)
--- a/test.hs
+++ b/test.hs
@@ -27,6 +27,11 @@ rNT = deriveThisNT
 bar :: NT (MyList Age) [Int]
 bar = deriveThisNT
 
+data F a b c = F a b c deriving Show
+
+fNT :: NT a a' -> NT (F a b c) (F a' b c)
+fNT = deriveThisNT
+
 main = do
     let n = 1 :: Int
     let a = coerce (sym ageNT) 1
@@ -39,4 +44,5 @@ main = do
     print $ coerce (foo (sym ageNT)) l3
     --print $ coerce bar (MyList [a])
     print $ coerce (sym rNT) []
+    print $ coerce (fNT (sym ageNT)) (F 1 2 3)