Lifting to the limit

Saswat Anand iscp9157@nus.edu.sg
Sat, 17 Feb 2001 10:50:19 -0800


Thanks a lot. It works fine.

Could you help me with this. With the following defintions, I want to be
able to write

(high \+ 4) (3.4,2) and
(4 \+ high) (3.4,2) which both should be equal to 4+ (high 2) = 6.

But hugs gives following error during run time:
ERROR: Unresolved overloading
*** Type       : Lift a => Integer
*** Expression : (high \+ 4) (1,1)

type Formula a b = a -> b

(\+) ::  (Lift a,Lift c,Num b)=>Formula a b -> Formula c b -> Formula Env b
p \+ q = \env -> (lift p) env + (lift q) env

type Env = (Double,Integer)

class Lift a where
 lift :: Formula a b -> Formula Env b

instance Lift Double where
 lift f (c,i) = f c

instance Lift Integer where
 lift f (c,i) = f i

instance Lift Env where
 lift = id

high :: Formula Integer Integer
high n = n+1

low :: Formula Double Integer
low = round

instance Eq (Formula a b) where
  (==) = error "<< error >>"

instance Show (Formula a b) where
 showsPrec n a1 = error "<< Formula >>"

instance (Num b) => Num (Formula a b) where    -- I tried instance (Lift a,
Num b) =>...... does not work
  fromInteger x = \a -> fromInteger x


Thanks,
Saswat


----- Original Message -----
From: Ken Shan <ken@digitas.harvard.edu>
To: Saswat Anand <iscp9157@nus.edu.sg>
Cc: <haskell@haskell.org>
Sent: Friday, February 16, 2001 12:17 PM
Subject: Re: Lifting to the limit


> Tis the season for type class overloading fun...
>
> On 2001-02-16T21:45:32+0800, Saswat Anand wrote:
> > lift2 :: (a -> b -> c) -> Formula d a -> Formula e b -> Formula Env c
>
> This type is too general.  You need to specify a context that requires
> both d and e to satisfy Lift:
>
>     lift2 :: (Lift d, Lift e) =>
>         (a -> b -> c) -> Formula d a -> Formula e b -> Formula Env c
>
> --
> Edit this signature at
> http://rodimus.digitas.harvard.edu/cgi-bin/ken/sig
> "The day Microsoft makes something that doesn't suck is probably the day
>                    they start making vacuum cleaners" - Ernst Jan Plugge