Getting rid of -XImpredicativeTypes

Simon Peyton Jones simonpj at
Mon Oct 3 09:14:42 UTC 2016

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?


From: Ganesh Sittampalam [mailto:ganesh at]
Sent: 02 October 2016 12:07
To: Simon Peyton Jones <simonpj at>; Alejandro Serrano Mena <trupill at>
Cc: ghc-devs at; ghc-users at
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.


From: Alejandro Serrano Mena [mailto:trupill at]
Sent: 26 September 2016 08:13
To: Simon Peyton Jones <simonpj at><mailto:simonpj at>
Cc: ghc-users at<mailto:ghc-users at>; ghc-devs at<mailto:ghc-devs at>
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

2016-09-25 20:05 GMT+02:00 Simon Peyton Jones via ghc-devs <ghc-devs at<mailto:ghc-devs at>>:

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.


ghc-devs mailing list
ghc-devs at<mailto:ghc-devs at><>


ghc-devs mailing list

ghc-devs at<mailto:ghc-devs at><>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the ghc-devs mailing list