Let us continue with the suggestions for Haskell-2.
To my note
>> Obstacle 3:
>> `newtype' cannot derive all the instances automatically.
>> Thus, in our case, add (Id 1) (Id 2) is illegal.
>> ...
>> why Haskell allows the `newtype' derivation only for the standard
>> classes? Why not support declarations like
>>
>> newtype N a b = N (T a b) deriving(Eq,Ord,AddGroup,Ring)
>> newtype N a b = N (T a b) deriving( all )
>> ?
>> Is there any ambiguity in conversion between (T a b) and N (T a b)
>> when N (T a b) inherits all the instances (T a b) matches in a
>> program?
Simon P.Jones replies
> 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.
If the language supports the declarations like
transparentNewtype T a b = a
then, probably, `all' is not needed (though, it needs more thinking).
At least, in Haskell-1.4 it was needed badly. Because to avoid the
instance overlap between C a and C (D a), the programmer was often
forced to introduce newtype CD a = CD (C (D a)) ...
and needed to derive `all' the old instances before adding specific
ones.
Also i have a feeling Haskell needs some sort of a
generic isomorphic deriving.
----------------------------
For example, suppose a program P declares the instances
<inst1>...<inst8> for Pol:
data Polynomial a = Pol [(Mon a)] a [String]
And suppose the application needs the extended polynomials - that
contain, say, ppComp :: PPComp, type PPComp = [[Int]] -> Comparison
- to inherit the old instances up to <inst7> and define specially the
instances <inst8>,<inst9> which make the essence of application.
Of course, the user is not to rewrite all P changing the Pol
declaration. Rather one puts
data EPol a = EPol (Polynomial a) PPComp
A natural way to continue is
data EPol a = EPol (Polynomial a) PPComp
isomorhicInstances{ (\ (EPol f _)-> f),
<inst1>...<inst7>
}
instance...=> <inst8> (EPol a) where <special way> ...
instance...=> <inst9> (EPol a) where <special way> ...
This means to port <inst1>...<inst7> by compiling each operation
o as follows:
cut the PPComp part pp (add the application of \(EPol f _)->f),
use the instance for Pol, put in the end pp back.
Only i wonder whether this is a correct suggestion.
Something is suspisious in its generality.
And if it is all right, then why not allow any bijective map pairs in
place of above \(EPol f _)->f ?
------------------
Sergey Mechveliani
[EMAIL PROTECTED]