Skip to content

Promoting newtype destructor

given

newtype LOL a = MkLOL { unLOL :: [[a]] }

I'd like to write

type family UnLOL (lol :: LOL a) = (result :: [[a]]) | result -> lol
type instance UnLOL ('MkLOL xss) = xss 

This is currently not accepted, but AFAICS it should be injective, as lol is kind restricted. Especially the example in injective type families paper do not apply, as UnLOL Int is ill-kinded.

With this GHC could infer lol ~ MkLOL xss from UnLOL lol ~ xss, so newtypes would be useful for type-level programming, as type (kind) synonyms cannot be partially applied.

Trac metadata
Trac field Value
Version
Type FeatureRequest
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC goldfire, kosmikus
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information