In the suggestions for Haskell-2  i wrote

>>  class (Ring r,AddGroup (m r)) => RightModule m r where  
>>                                             cMul :: m r -> r -> m r
>>  instance Ring r => RightModule r r  where  cMul = mul
>> ...
>> Haskell rejects this    `=> RightModule r r'
>> How can we express the meaning
           ... RightModule m r  where  m  is the identical constructor
                                                             (m a = a)
>> Scripting   newtype Id a = Id a  deriving(...)
>>             instance Ring r => RightModule Id r  where
>>                                     cMul (Id r) r' =  Id (mul r r')
>> is an awkward way-out.


Simon L Peyton Jones <[EMAIL PROTECTED]>  replies


> So here,  m :: *->*
> What you really want is to say
> 
>   instance Ring r => RightModule (\t->t) r where  cMul = mul
> 
> so that now you can use cMul at type  cMul :: Foo -> Foo -> Foo
> (provided Foo is an instance of Ring).
>
> The '(\t->t)::*->*' is your 'transparent newtype' function.  


Exactly. Thank you for explanation.


> ...
> What I don't know how to do is to perform type inference on such 
> systems. 
> ... "It's complicated".


OK.
Then, with the Haskell-2 instrument, we will, probably, script

  newtype Id a = Id a  deriving(...)
  instance Ring r => RightModule Id r  where
                                     cMul (Id r) r' =  Id (mul r r')

and tolerate the conversion between  r  and  Id r.
And the application consideres Id as a parasitic constructor forced 
by the language restriction.

So, to reduce this infelicity, we need here

  newtype Id a = Id a  deriving( all )

- as i proposed in the recent letters.

S.P.Jones:
>  That would indeed be possible for newtype; but my guess is
>  that if you want 'all' then you ought to be able to get away without
>  a newtype at all.  But I might well be wrong about this.
>  Anyway, it's not an unreasonable suggestion.


`all' is necessary here.
Because the program deals with the values of type  Ring r => r,  and 
after introducing of Id, it has also to deal with  Ring r => Id r  and 
Ring (Id r) => Id r   
(+,*,cMul  applied to  r  as well as to  Id r  things),
and Ring is preceeded by certain superclass hierarhy ...
 
At least, it is needed here  ...deriving( (upTo Ring) ) 

Am i missing something?


------------------
Sergey Mechveliani
[EMAIL PROTECTED]





Reply via email to