{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE KindSignatures #-}
module Main where
import Language.Haskell.TH.ExpandSyns
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
-- type A = forall a. B a; type B a = Maybe a; expand [t|B A|]
type A x = [x]
type B f = forall x. f x
type C f = f Integer
test1 = $(
do
t1 <- [t| forall a. Show a => a -> B [] -> (Int,C []) |]
expected <- [t| forall a. Show a => a -> (forall x. [] x) -> (Int,[] Integer) |]
report False ("expected: "++pprint expected)
actual <- expandSyns t1
report False ("actual: "++pprint actual)
if (pprint expected==pprint actual) then [| putStrLn "Ok" |] else [| error "expected /= actual" |]
)
main = test1