Re: InstanceSigs -- rationale for the "must be more polymorphic than"

2021-08-08 Thread David Feuer
To the best of my knowledge, `InstanceSigs` are never strictly necessary.
They can, however, be useful for at least four purposes:

1. To provide a compiler-checked reminder of the type.
2. To bind type variables with `ScopedTypeVariables`.
3. To generalize the type so you can use polymorphic recursion.
4. To enhance parametricitry/polymorphism for internal documentation
purposes.

The third reason is probably the main technical one to allow a more general
signature, but the fourth is likely helpful too.

On Sun, Aug 8, 2021, 3:04 AM Anthony Clayden 
wrote:

> I can't help but feel InstanceSigs are either superfluous or upside-down.
> It's this bit in the User Guide:
>
> > The type signature in the instance declaration must be
> > more polymorphic than (or the same as) the one in the class declaration,
> > instantiated with the instance type.
>
> Usually if you give a signature, it must be _less_ polymorphic (or the
> same as) the type inferred from the term:
>
> >lessPolyPlus :: Integral a => a -> a -> a
> >lessPolyPlus x y = x + y
>
> Or
>
> >lessPolyPlus (x :: a) y = x + y :: Integral a => a
>
> The examples in the User Guide aren't helping: you could just drop the
> InstanceSigs, and all is well-typed. (Even the example alleging to use
> -XScopedTypeVariables in a where sub-decl: you could just put random `xs ::
> [b]` without scoping `b`.)
>
> Dropping the Sigs altogether works because the type from the class decl,
> suitably instantiated, is less polymorphic than inferred from the term. IOW
> the suitably instantiated type restricts what would otherwise be inferred.
> Situation normal.
>
> I suppose it might be helpful to give an explicit InstanceSig as 'belt and
> braces' for the instantiated -- possibly because the instantiation is hard
> to figure out; possibly because you want to use -XScopedTypeVariables
> within a where-bound sub-decl, as an extra piece of string.
>
> I can see you mustn't make the InstanceSig _less_ polymorphic than the
> suitably instantiated.
>
> But the docos don't give any example where it's essential to provide an
> InstanceSig _and_  make it strictly more polymorphic. Here all the sigs and
> annotations are just superfluous:
>
> >maxPolyPlus :: Num a => a -> a -> a
> >maxPolyPlus = (+)
> >
> >class C a  where foo :: a -> T a
> >instance Integral a => C a  where
> >  foo :: Num a => a -> T a
> >  foo (x :: a) = MkT (maxPolyPlus x x :: Num a => a)
>
> Is there a persuasive example (to put in the User Guide)?
>
> AntC
>
> ___
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users
>
___
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users


InstanceSigs -- rationale for the "must be more polymorphic than"

2021-08-08 Thread Anthony Clayden
I can't help but feel InstanceSigs are either superfluous or upside-down.
It's this bit in the User Guide:

> The type signature in the instance declaration must be
> more polymorphic than (or the same as) the one in the class declaration,
> instantiated with the instance type.

Usually if you give a signature, it must be _less_ polymorphic (or the same
as) the type inferred from the term:

>lessPolyPlus :: Integral a => a -> a -> a
>lessPolyPlus x y = x + y

Or

>lessPolyPlus (x :: a) y = x + y :: Integral a => a

The examples in the User Guide aren't helping: you could just drop the
InstanceSigs, and all is well-typed. (Even the example alleging to use
-XScopedTypeVariables in a where sub-decl: you could just put random `xs ::
[b]` without scoping `b`.)

Dropping the Sigs altogether works because the type from the class decl,
suitably instantiated, is less polymorphic than inferred from the term. IOW
the suitably instantiated type restricts what would otherwise be inferred.
Situation normal.

I suppose it might be helpful to give an explicit InstanceSig as 'belt and
braces' for the instantiated -- possibly because the instantiation is hard
to figure out; possibly because you want to use -XScopedTypeVariables
within a where-bound sub-decl, as an extra piece of string.

I can see you mustn't make the InstanceSig _less_ polymorphic than the
suitably instantiated.

But the docos don't give any example where it's essential to provide an
InstanceSig _and_  make it strictly more polymorphic. Here all the sigs and
annotations are just superfluous:

>maxPolyPlus :: Num a => a -> a -> a
>maxPolyPlus = (+)
>
>class C a  where foo :: a -> T a
>instance Integral a => C a  where
>  foo :: Num a => a -> T a
>  foo (x :: a) = MkT (maxPolyPlus x x :: Num a => a)

Is there a persuasive example (to put in the User Guide)?

AntC
___
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users