[GHC] #8739: ($) returning kind # no longer type checks

GHC ghc-devs at haskell.org
Thu Feb 13 22:39:48 UTC 2014


#8739: ($) returning kind # no longer type checks
-------------------------------------+------------------------------------
        Reporter:  NeilMitchell      |            Owner:
            Type:  bug               |           Status:  infoneeded
        Priority:  normal            |        Milestone:  7.8.1
       Component:  Compiler          |          Version:  7.8.1-rc1
      Resolution:                    |         Keywords:
Operating System:  Unknown/Multiple  |     Architecture:  Unknown/Multiple
 Type of failure:  None/Unknown      |       Difficulty:  Unknown
       Test Case:                    |       Blocked By:
        Blocking:                    |  Related Tickets:
-------------------------------------+------------------------------------

Comment (by simonpj):

 It's absolutely right that the second argument to `($)` must not have an
 unboxed kind.  Because the code for `($)` must move that argument around
 (pass to the function), so it must know its width, pointerhood ect.

 But actually it would be ok for the ''result'' of the call `(f $ x)` to be
 unboxed, because the code for `($)` doesn't mess with the result; it just
 tail-calls `f`.

 It's a bit like the call `(error "foo")` which is allowed to have an
 unboxed type.  So `error` has a rather magical type
 {{{
 error :: forall (a:OpenKind). String -> a
 }}}
 where the funny quantifier `a:OpenKind` allows `a` to be instantiated to
 `Int#` as well as to `Int`.

 So we could regard `($)` as having the type
 {{{
 ($) :: forall (a:*) (r:OpenKind). (a->r) -> a -> r
 }}}
 reflecting the fact that the result kind can range over unboxed types.

 Unless I'm being stupid here, the fix is simple in `TcExpr`, lines
 329-ish:
  * Remove `b_ty <- newPolyFlexiTyVarTy`
  * Remove the `unifyType op_res_ty b_ty`
  * Replace the other reference to `b_ty` with `op_res_ty`

 Would someone like to try?  Of course this deserves an elaboration of
 `Note [Typing rule for ($)]`, and a reference to this ticket.

 Simon

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


More information about the ghc-tickets mailing list