defining (-> Bool) as a set

Jorge Adriano
Tue, 23 Apr 2002 00:53:52 +0100

On Monday 22 April 2002 23:31, Hal Daume III wrote:
> I'd like to be able to define something like
> instance Eq a =3D> Coll (-> Bool) a where
>   empty    =3D \_ -> False
>   single x =3D \y -> if x =3D=3D y then True else False
>   union a b =3D \x -> a x || b x
>   insert s x =3D \y -> x =3D=3D y || s y
> and the like
> However, this seems to be impossible.  Is this the type lambda restrict=
> that's been discussed recently on the mailing list?
>  - Hal

Hi Hal,=20
I'd do it like this, hope it helps.
module Test where

newtype  BinClass a =3D BC (a->Bool)

class  Coll c a where
  empty  :: c a
  single :: a->c a
  union  :: c a->c a->c a
  insert :: c a->a->c a

instance Eq a =3D> Coll BinClass a where
    empty    =3D BC(\_->True)
    single x =3D BC(\y -> if x =3D=3D y then True else False)
    union  (BC a) (BC b) =3D BC(\x -> a x || b x)
    insert (BC s) x      =3D BC(\y -> x =3D=3D y || s y)