[GHC] #9404: tcInferRho muddies the waters

GHC ghc-devs at haskell.org
Tue Nov 18 19:38:15 UTC 2014


#9404: tcInferRho muddies the waters
-------------------------------------+-------------------------------------
              Reporter:  goldfire    |            Owner:  goldfire
                  Type:  bug         |           Status:  patch
              Priority:  normal      |        Milestone:
             Component:  Compiler    |          Version:  7.9
            Resolution:              |         Keywords:
      Operating System:              |     Architecture:  Unknown/Multiple
  Unknown/Multiple                   |       Difficulty:  Unknown
       Type of failure:              |       Blocked By:
  None/Unknown                       |  Related Tickets:
             Test Case:              |
              Blocking:              |
Differential Revisions:  Phab:D469   |
-------------------------------------+-------------------------------------

Comment (by goldfire):

 On Phab:D469, Simon says, about line 328 of !TcExpr:

 > This smells wrong. tcInferRho ends up calling tcInfer, which makes an
 OpenKind ReturnTv. But then we unify it with a liftedTypeKind ReturnTv
 later.
 >
 > Complicated and silly. Better if tcInferRho takes the kind it is
 expecting. Then we have only one ReturnTv, not two; and the whole ReturnTv
 story is located in tcInfer, rather than having a non-return-ish hack in
 the typing rule for $
 >
 > Make sense?

 I've decided: no, this doesn't make sense. The call to `tcInferRho` is to
 infer the type of the left-hand argument to `$`. This type is a function
 type `arg -> res`. If it turns out to be unlifted, the
 `matchExpectedFunTys` will fail. The silliness with the new `ReturnTy` bit
 isn't about the result of `tcInferRho` -- it's about the result of
 `matchExpectedFunTys`. So the straightforward refactoring Simon proposes
 doesn't work.

 Instead, what we should do here is to unify `arg2_ty`'s kind with `*`. But
 !TcUnify doesn't have a function for that -- something like
 `matchExpectedStar`. The closest thing -- `unifyKindX` tells us about sub-
 kinding relationships, instead of actually unifying the kinds.

 So, I propose: do nothing for now. It's working, although a little uglily,
 as is. When we have proper kind equalities and no sub-kinding anymore,
 this will be easy to fix. Please close the ticket if you agree.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9404#comment:15>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list