
#10141: CUSK mysteries -------------------------------------+------------------------------------- Reporter: goldfire | Owner: goldfire Type: bug | Status: new Priority: normal | Milestone: 8.2.1 Component: Compiler | Version: 7.10.1-rc2 Resolution: | Keywords: TypeFamilies Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: indexed- | types/should_fail/T10141 Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): Here's an example that I was baffled by. This works {{{ type family F (a :: k) type instance F Maybe = Char }}} But this does not. {{{ type family F (a :: k) where -- = r | r -> a where F Maybe = Char }}} The latter is rejected with {{{ Foo.hs:6:5: error: * Expecting one more argument to `Maybe' Expected kind `k', but `Maybe' has kind `* -> *' * In the first argument of `F', namely `Maybe' In the type family declaration for `F' }}} It is bizarre that one works and the other does not, and I was all ready to open a ticket when Richard said: This is correct behavior. The former has a CUSK, as all open type families have CUSKs with un-annotated kinds defaulting to Type. The latter does not have a CUSK, because the result kind is unknown. You therefore cannot specialize the k variable in the definition of the latter. I can't help feeling that our CUSK story is a bit wonky, so I'm recording it here. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10141#comment:15 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler