data T a = T a (a -> Int) data SomeT > T a i1 = T 7 (1+) p1 = i1 :: SomeT i2 = T "abc" length p2 = i2 :: SomeT open1 (T v f) = f v open2 :: SomeT -> _ open2 (T v f) = f v ok1 = open1 i1 ok2 = open1 i2 ok3 = open2 p1 ok4 = open2 p2 ok5 = open2 i1 ok6 = open2 i2 --bad1 = open1 p1 --bad2 = open1 p2