
#6018: Injective type families -------------------------------------+------------------------------------- Reporter: lunaris | Owner: jstolarek Type: feature | Status: new request | Milestone: 7.10.1 Priority: normal | Version: 7.4.1 Component: Compiler | Keywords: TypeFamilies, Resolution: | Injective Operating System: | Architecture: Unknown/Multiple Unknown/Multiple | Difficulty: Unknown Type of failure: | Blocked By: None/Unknown | Related Tickets: #4259 Test Case: | Blocking: | Differential Revisions: Phab:D202 | -------------------------------------+------------------------------------- Comment (by simonpj): The difficulty is that when you say {{{ type family F (a::*) :: * }}} you expect `a` to be a ''type'' variable and `*` to be a ''kind''. So if you say {{{ type family F (a::*) :: (b :: *) }}} it looks as though `b` is a ''kind'' variable, and `*` is a ''sort''. That's why Reid wants to use `=` rather than `::`, and he is right. It's reasonable to have either of these {{{ type family F a :: * type family F a = (b :: *) }}} but not {{{ type family F a :: (b :: *) }}} The merit of the "= blah" notation is that it allows us to give a name to the result, rather than use a magic name. I think it's probably just about worth the syntactic cost. Simon -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/6018#comment:71 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler