-- The translation of this program should assign only one dictionary to
-- the function search (an Ord dictionary). Instead, it assigns two.
-- The output produced currently displays this.

-- 10/12/92:  This program is actually erroneous.  The pattern-binding for
-- search falls under the monomorphism restriction, and there is no
-- call to search which might fix its type.  So there should be a complaint.
-- But the actual error message is horrible:
--
-- "bug001.hs", line 26: Ambiguous overloading:
--     class "Ord_", type "a" (at a use of an overloaded identifier: gt)
--     class "Eq_", type "a" (at a use of an overloaded identifier: eq)


module TcFail where

class Eq_ a where
 eq :: a -> a -> Bool

instance Eq_ Int where
 eq = eqIntEq

instance (Eq_ a) => Eq_ [a] where
 eq = \ xs ys ->
     if (null xs)
        then (null ys)
        else if (null ys)
                then False
                else (&&) (eq (hd xs) (hd ys)) (eq (tl xs) (tl ys))

class (Eq_ a) => Ord_ a where
 gt :: a -> a -> Bool

instance Ord_ Int where
 gt = ordIntGt

search
 = \ a bs -> if gt (hd bs) a
                then False
                else if eq a (hd bs) then True else search a (tl bs)


hd :: [a] -> a
hd (a:as) = a

tl :: [a] -> [a]
tl (a:as) = as

ordIntGt :: Int -> Int -> Bool
ordIntGt 2 3 = True

eqIntEq :: Int -> Int -> Bool
eqIntEq  2 3 = True




{-

===============================================
Main.Eq__INST_PreludeBuiltin.Int =
    let
      AbsBinds [] [] [(eq, eq)]
          {- nonrec -}
          {-# LINE 2 "test3.hs" -}

          eq :: PreludeBuiltin.Int -> PreludeBuiltin.Int -> PreludeCore.Bool
          eq = Main.eqIntEq
    in ({-dict-} [] [eq])

Main.Eq__INST_PreludeBuiltin.List =
    /\ t135 ->
        \{-dict-} _dict138 ->
            let
              {- nonrec -}
              _dict136 = {-singleDict-} _dict138
              {- nonrec -}
              _dict129 = {-singleDict-} _dict136
              AbsBinds [] [] [(eq, eq)]
                  {- nonrec -}

                  _dict133 =
                      Main.Eq__INST_PreludeBuiltin.List
                          [t135] [{-singleDict-} _dict136]
                  {- nonrec -}
                  {-# LINE 5 "test3.hs" -}

                  eq :: [t135] -> [t135] -> PreludeCore.Bool
                  eq = \ xs ys ->

if (Main.null t135) xs then
                                      (Main.null t135) ys
                                  else

                                      if (Main.null t135) ys then
                                          PreludeCore.False
                                      else

                                          Main.and


                                              ((Main.Eq_.eq t135 _dict129)


                                                   ((Main.hd t135) xs)
                                                   ((Main.hd t135) ys))






(Main.Eq_.eq [t135] _dict133)



                                                   ((Main.tl t135) xs)
                                                   ((Main.tl t135) ys))
            in ({-dict-} [] [eq])
Main.Ord__INST_PreludeBuiltin.Int =
    let
      {- nonrec -}
      _dict142 = Main.Eq__INST_PreludeBuiltin.Int [] []
      AbsBinds [] [] [(gt, gt)]
          {- nonrec -}
          {-# LINE 16 "test3.hs" -}

          gt :: PreludeBuiltin.Int -> PreludeBuiltin.Int -> PreludeCore.Bool
          gt = Main.ordIntGt
    in ({-dict-} [_dict142] [gt])

Main.Eq_.eq = /\ a -> \{-classdict-} [] [eq] -> eq

Main.Ord_.gt = /\ a -> \{-classdict-} [_dict56] [gt] -> gt

Main.Ord__TO_Main.Eq_ = /\ a -> \{-classdict-} [_dict58] [gt] -> ???_dict58???

AbsBinds [t60] [] [(hd, Main.hd)]
    {- nonrec -}



    hd :: [t60] -> t60
    hd (a PreludeBuiltin.: as)
               = a

AbsBinds [t68] [] [(tl, Main.tl)]
    {- nonrec -}




    tl :: [t68] -> [t68]
    tl (a PreludeBuiltin.: as)
               = as


AbsBinds [t91] [_dict85, _dict88] [(search, Main.search)]
    {- rec -}
    {-# LINE 19 "test3.hs" -}


    search :: t91 -> [t91] -> PreludeCore.Bool
    search
        = \ a bs ->


if (Main.Ord_.gt t91 _dict85) ((Main.hd t91) bs) a then
                        PreludeCore.False
                    else

                        if (Main.Eq_.eq t91 _dict88) a ((Main.hd t91) bs) then
                            PreludeCore.True
                        else

                            search a ((Main.tl t91) bs)
AbsBinds [] [] [(and, Main.and)]
    {- nonrec -}
    and :: PreludeCore.Bool -> PreludeCore.Bool -> PreludeCore.Bool
    and PreludeCore.True PreludeCore.True
                = PreludeCore.True
AbsBinds [] [] [(ordIntGt, Main.ordIntGt)]
    {- nonrec -}
    _dict97 = PreludeCore.Num_INST_PreludeBuiltin.Int [] []
    {- nonrec -}
    _dict98 = PreludeCore.Eq_INST_PreludeBuiltin.Int [] []
    {- nonrec -}
    _dict100 = PreludeCore.Num_INST_PreludeBuiltin.Int [] []
    {- nonrec -}
    _dict101 = PreludeCore.Eq_INST_PreludeBuiltin.Int [] []
    {- nonrec -}



    ordIntGt :: PreludeBuiltin.Int -> PreludeBuiltin.Int -> PreludeCore.Bool
    ordIntGt
        2 3 = PreludeCore.True
AbsBinds [] [] [(eqIntEq, Main.eqIntEq)]
    {- nonrec -}
    _dict105 = PreludeCore.Num_INST_PreludeBuiltin.Int [] []
    {- nonrec -}
    _dict106 = PreludeCore.Eq_INST_PreludeBuiltin.Int [] []
    {- nonrec -}
    _dict108 = PreludeCore.Num_INST_PreludeBuiltin.Int [] []
    {- nonrec -}
    _dict109 = PreludeCore.Eq_INST_PreludeBuiltin.Int [] []
    {- nonrec -}

    eqIntEq :: PreludeBuiltin.Int -> PreludeBuiltin.Int -> PreludeCore.Bool
    eqIntEq
        2 3 = PreludeCore.True


AbsBinds [t112] [] [(null, Main.null)]
    {- nonrec -}

    null :: [t112] -> PreludeCore.Bool
    null [] = PreludeCore.True
-}
