{-# LANGUAGE DatatypeContexts #-} module Foo where data Eq a => Foo a = Constr a isEq :: Foo a -> Foo a -> Bool isEq (Constr x) (Constr y) = x == y getVal :: Foo a -> a getVal (Constr x) = x