module Main where class A a class (A a) => B a class (B a) => C a data D1 = D1 Int Int data D2 = D2 String String instance C D1 instance C D2 prf :: (C x) => x -> String prf (D1 y z) = show y prf (D2 t s) = t d1 = D1 3 5 d2 = D2 "aaa" "bbb" main = do putStrLn $ prf d1 putStrLn $ prf d2