Aha! For some reason, it never clicked that you could use forall
within a datatype's kind signature like that. That technique would, at
the very least, allow me to guarantee the order in which the kind
variables appear. Thanks!

It's a bit of a shame that type inference doesn't give you a reliable
order, but I suppose if you rely on -XTypeApplications working a
certain way, you're taking a risk by NOT using a forall.

Ryan S.

On Tue, Apr 12, 2016 at 10:30 PM, Richard Eisenberg <[email protected]> wrote:
> I don't think this has to do with topological sorting so much as inferring 
> the order of undeclared (but written) kind variables. You could, with 
> -XTypeInType, always make the order explicit:
>
>> data T :: forall j k l x y z. (j -> k -> l) -> (x, y, z) -> * where MkT :: T 
>> a b
>
> The order of these variables is derived from the extractHsTyRdrTyVars 
> function and friends in RnTypes. I'm sure you could look closely at those 
> functions and see where the behavior is coming from. It's very likely an 
> improvement can be found here.
>
> Richard
>
> On Apr 12, 2016, at 7:47 PM, Ryan Scott <[email protected]> wrote:
>
>> I'm doing some work in GHC that requires explicitly applying kinds to
>> the kind variables of a data type. I noticed that the order in which
>> the implicit kind variables are sorted is not as predictable as I
>> originally thought. To illustrate what I mean, here is a GHCi session
>> I had recently (with GHC HEAD):
>>
>>    $ /opt/ghc/head/bin/ghci -XTypeInType
>>    GHCi, version 8.1.20160412: http://www.haskell.org/ghc/  :? for help
>>    Loaded GHCi configuration from /home/ryanglscott/.ghci
>>> data T (a :: j -> k -> l) (b :: (x, y, z)) = MkT
>>> :t MkT
>>    MkT
>>      :: forall x y z l k j (a :: j -> k -> l) (b :: (x, y, z)). T a b
>>
>> Much to my surprise, the order of the kind variables wasn't [j, k, l,
>> x, y, z], but rather [x, y, z, l, k, j]! I know that type variables
>> are sorted with a stable topological sort [1], but there must be some
>> other subtlety that I'm missing. How does GHC come up with the order
>> [x, y, z, l, k, j]?
>>
>> Ryan S.
>> -----
>> [1] 
>> http://git.haskell.org/ghc.git/blob/d81cdc227cd487659995ddea577214314c9b4b97:/docs/users_guide/glasgow_exts.rst#l8708
>> _______________________________________________
>> ghc-devs mailing list
>> [email protected]
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>
_______________________________________________
ghc-devs mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to