content: {-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies,
               FlexibleInstances #-}
  
  -- !!! Functional dependencies
  -- This one made the 5.00.1 typechecker go into an infinite loop.
  -- The context simplifier keep thinking it was doing an 'improve'
  -- step, and hence kept going round and round.
  
  module Main where
  
  main = print (get ((AttributeLeaf (MyLabel "x") 4)::Env1) (MyLabel "x"))
  
  class Eq l => Domain d l | d -> l where
          (<<) :: d -> d -> d
          empty :: d
  class Domain e l => Environment e l t | e -> l t where
          get :: e -> l -> Maybe t
          attribute :: l -> t -> e
  
  class Eq' a where
          (=?=) :: a -> a -> Bool
  
  newtype MyLabel = MyLabel String deriving Eq
  
  instance Eq' MyLabel where
          l =?= l' = l == l'
  
  data BinTreeEnv l t =
          EmptyEnv |
          AttributeLeaf l t |
          Union (BinTreeEnv l t) (BinTreeEnv l t)
  
  instance (Eq l, Eq' l) => Domain (BinTreeEnv l t) l where
          EmptyEnv << d = d
          d << EmptyEnv = d
          d << d' = Union d d'
          empty = EmptyEnv
  
  instance (Eq l, Eq' l) => Environment (BinTreeEnv l t) l t where
          get EmptyEnv l = Nothing
          get (AttributeLeaf l t) l' = if l =?= l' then Just t
                                       else Nothing
          get (Union d d') l = error "!??"
  
          attribute l t = AttributeLeaf l t
  
  type Env1 = BinTreeEnv MyLabel Integer
  
  