Indeed, as I said “I mis-spoke before: In my proposal we WILL allow types like
(Tree (forall a. a->a))”.
So yes, such types will be possible in type signatures (with
ImpredicativeTypes). But using functions with such type signatures will be
tiresome, because you’ll have to use VTA on every occasion. E.g. if
xs :: [forall a. a->a]
then you can’t say (reverse xs), because that requires impredicative
instantiation of reverse’s type argument. You must stay
reverse @(forall a. a->a) xs
Does that help?
Simon
From: Ganesh Sittampalam [mailto:[email protected]]
Sent: 02 October 2016 12:07
To: Simon Peyton Jones <[email protected]>; Alejandro Serrano Mena
<[email protected]>
Cc: [email protected]; [email protected]
Subject: Re: Getting rid of -XImpredicativeTypes
Elsewhere in the thread, you said
1) ImpredicativeTypes enables types like `Maybe (forall a. a)`. Do those just
disappear, or are they also enabled anyway? (I would guess the former.)
Yes, they’d disappear.
but here you're talking about 'xs :: [forall a . a->a]' being possible with VTA
- is the idea that such types will be possible but only with both explicit
signatures and VTA?
On 30/09/2016 16:29, Simon Peyton Jones via ghc-devs wrote:
Alejandro: excellent point. I mis-spoke before. In my proposal we WILL allow
types like (Tree (forall a. a->a)).
I’m trying to get round to writing a proposal (would someone else like to write
it – it should be short), but the idea is this:
When you have -XImpredicativeTypes
· You can write a polytype in a visible type argument; eg. f @(forall
a. a->a)
· You can write a polytype as an argument of a type in a signature
e.g. f :: [forall a. a->a] -> Int
And that’s all. A unification variable STILL CANNOT be unified with a
polytype. The only way you can call a polymorphic function at a polytype is to
use Visible Type Application.
So using impredicative types might be tiresome. E.g.
type SID = forall a. a->a
xs :: [forall a. a->a]
xs = (:) @SID id ( (:) @SID id ([] @ SID))
In short, if you call a function at a polytype, you must use VTA. Simple,
easy, predictable; and doubtless annoying. But possible.
Simon
From: Alejandro Serrano Mena [mailto:[email protected]]
Sent: 26 September 2016 08:13
To: Simon Peyton Jones <[email protected]><mailto:[email protected]>
Cc: [email protected]<mailto:[email protected]>;
[email protected]<mailto:[email protected]>
Subject: Re: Getting rid of -XImpredicativeTypes
What would be the story for the types of the arguments. Would I be allowed to
write the following?
> f (lst :: [forall a. a -> a]) = head @(forall a. a -> a) lst 3
Regards,
Alejandro
2016-09-25 20:05 GMT+02:00 Simon Peyton Jones via ghc-devs
<[email protected]<mailto:[email protected]>>:
Friends
GHC has a flag -XImpredicativeTypes that makes a half-hearted attempt to
support impredicative polymorphism. But it is vestigial…. if it works, it’s
really a fluke. We don’t really have a systematic story here at all.
I propose, therefore, to remove it entirely. That is, if you use
-XImpredicativeTypes, you’ll get a warning that it does nothing (ie. complete
no-op) and you should remove it.
Before I pull the trigger, does anyone think they are using it in a
mission-critical way?
Now that we have Visible Type Application there is a workaround: if you want to
call a polymorphic function at a polymorphic type, you can explicitly apply it
to that type. For example:
{-# LANGUAGE ImpredicativeTypes, TypeApplications, RankNTypes #-}
module Vta where
f x = id @(forall a. a->a) id @Int x
You can also leave out the @Int part of course.
Currently we have to use -XImpredicativeTypes to allow the @(forall a. a->a).
Is that sensible? Or should we allow it regardless? I rather think the
latter… if you have Visible Type Application (i.e. -XTypeApplications) then
applying to a polytype is nothing special. So I propose to lift that
restriction.
I should go through the GHC Proposals Process for this, but I’m on a plane, so
I’m going to at least start with an email.
Simon
_______________________________________________
ghc-devs mailing list
[email protected]<mailto:[email protected]>
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmail.haskell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-devs&data=01%7C01%7Csimonpj%40microsoft.com%7Cd4eb1fd61d0148cea9f508d3e5dca6fe%7C72f988bf86f141af91ab2d7cd011db47%7C1&sdata=ZM3djztmpA09J6x1DmmV0LEeftsA1FhjPhjwLuG5w%2FE%3D&reserved=0>
_______________________________________________
ghc-devs mailing list
[email protected]<mailto:[email protected]>
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmail.haskell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-devs&data=01%7C01%7Csimonpj%40microsoft.com%7C2a21525b2ae3432ba31e08d3eab43e4c%7C72f988bf86f141af91ab2d7cd011db47%7C1&sdata=Y9f9UGWEd1%2FHwNFLQx2XRrlk35gZeK7Sm2w1NBnU3FY%3D&reserved=0>
_______________________________________________
ghc-devs mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs