{-# LANGUAGE ExistentialQuantification #-} data Value = A Int data ForallFunc = forall a. Eq a => Forall (Value -> a) unpackA (A int) = int equalityTest :: Value -> Value -> ForallFunc -> Bool equalityTest arg1 arg2 (Forall unpacker) = let a1 = unpacker arg1 a2 = unpacker arg2 in a1 == a2 main = putStrLn $ show $ equalityTest (A 1) (A 1) (Forall unpackA)