These observations from Ed and Dan are quite helpful. Could one of you put them 
on the wiki page? I hadn't considered the possibility of truly parametric 
levity polymorphism.

Thanks!
Richard

On Sep 9, 2015, at 3:30 PM, Edward Kmett <ekm...@gmail.com> wrote:

> I think ultimately the two views of levity that we've been talking diverge 
> along the same lines as the pi vs forall discussion from your Levity 
> polymorphism talk.
> 
> I've been focused entirely on situations where forall suffices, and no 
> distinction is needed in how you compile for both levities.
> 
> Maybe could be polymorphic using a mere forall in the levity of the boxed 
> argument it carries as it doesn't care what it is, it never forces it, 
> pattern matching on it just gives it back when you pattern match on it.
> 
> Eq or Ord could just as easily work over anything boxed. The particular Eq 
> _instance_ needs to care about the levity.
> 
> Most of the combinators for working with Maybe do need to care about that 
> levity however.
> 
> e.g. consider fmap in Functor, the particular instances would care. Because 
> you ultimately wind up using fmap to build 'f a' values and those need to 
> know how the let binding should work. There seems to be a pi at work there. 
> Correct operational behavior would depend on the levity.
> 
> But if we look at what inference should probably grab for the levity of 
> Functor:
> 
> you'd get:
> 
> class Functor (l : Levity) (l' : Levity') (f :: GC l -> GC l') where 
>    fmap :: forall a b. (a :: GC l) (b :: GC l). (a -> b) -> f a -> f b
> 
> Baed on the notion that given current practices, f would cause us to pick a 
> common kind for a and b, and the results of 'f'. Depending on how and if we 
> decided to default to * unless annotated in various situations would drive 
> this closer and closer to the existing Functor by default.
> 
> These are indeed distinct functors with distinct operational behavior, and we 
> could implement each of them by supplying separate instances, as the levity 
> would take part in the instance resolution like any other kind argument.
> 
> Whether we could expect an average Haskeller to be willing to do so is an 
> entirely different matter.
> 
> -Edward
> 
> 
> On Wed, Sep 9, 2015 at 12:44 PM, Dan Doel <dan.d...@gmail.com> wrote:
> On Wed, Sep 9, 2015 at 9:03 AM, Richard Eisenberg <e...@cis.upenn.edu> wrote:
> > No functions (excepting `error` and friends) are truly levity polymorphic.
> 
> I was talking with Ed Kmett about this yesterday, and he pointed out
> that this isn't true. There are a significant array of levity
> polymorphic functions having to do with reference types. They simply
> shuffle around pointers with the right calling convention, and don't
> really care what levity their arguments are, because they're just
> operating uniformly either way. So if we had:
> 
>     MVar# :: forall (l :: Levity). * -> TYPE (Boxed l) -> TYPE (Boxed 
> Unlifted)
> 
> then:
> 
>     takeMVar :: forall s (l :: Levity) (a :: TYPE (Boxed l)). MVar# s
> l a -> State# s -> (# State# s, a #)
>     putMVar :: forall s (l :: Levity) (a :: Type (Boxed l)). MVar# s l
> a -> a -> State# s -> State# s
> 
> are genuinely parametric in l. And the same is true for MutVar#,
> Array#, MutableArray#, etc.
> 
> I think data type constructors are actually parametric, too (ignoring
> data with ! in them for the moment; the underlying constructors of
> those). Using a constructor just puts the pointers for the fields in
> the type, and matching on a constructor gives them back. They don't
> need to care whether their fields are lifted or not, they just
> preserve whatever the case is.
> 
> But this:
> 
> > We use levity polymorphism in the types to get GHC to use its existing type 
> > inference to infer strictness. By the time type inference is done, we must 
> > ensure that no levity polymorphism remains, because the code generator 
> > won't be able to deal with it.
> 
> Is not parametric polymorphism; it is ad-hoc polymorphism. It even has
> the defaulting step from type classes. Except the ad-hoc has been
> given the same notation as the genuinely parametric, so you can no
> longer identify the latter. (I'm not sure I'm a great fan of the
> ad-hoc part anyway, to be honest.)
> 
> -- Dan
> _______________________________________________
> ghc-devs mailing list
> ghc-devs@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
> 

_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to