[ghc-steering-committee] Unsaturated type families (#242)
Simon Peyton Jones
simonpj at microsoft.com
Wed Nov 25 15:28:55 UTC 2020
I'm on board with unsaturated type families.
Like Linear Haskell, it's quite a "big" proposal, but accepting it is compatible with idea of Haskell as a laboratory for exploration. I think we should flag it as experimental, with the implication that details are liable to change as we gain experience.
Like others, I'd like us to converge on #370 before fixing syntax.
I don’t have a strong opinion about the defaulting stuff.
Declaration of interest: I'm a co-author on the paper.
Simon
| -----Original Message-----
| From: ghc-steering-committee <ghc-steering-committee-
| bounces at haskell.org> On Behalf Of Richard Eisenberg
| Sent: 20 November 2020 19:36
| To: Simon Peyton Jones via ghc-steering-committee <ghc-steering-
| committee at haskell.org>
| Subject: [ghc-steering-committee] Unsaturated type families (#242)
|
| Hi committee,
|
| Csongor Kiss has proposed -XUnsaturatedTypeFamilies.
|
| Proposal:
| https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgith
| ub.com%2Fkcsongor%2Fghc-proposals%2Fblob%2Funsaturated-type-
| families%2Fproposals%2F0000-unsaturated-type-
| families.rst&data=04%7C01%7Csimonpj%40microsoft.com%7Cbd9e62e3137e
| 40385b5f08d88d8b91e0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C1%7C6374
| 14978666235646%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2l
| uMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=WdLjCp2ReG9ZXOjmE
| Ow6VCJlAO7Yf1aWkVAXHxrsmMM%3D&reserved=0
| ICFP'19 paper:
| https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.
| microsoft.com%2Fen-
| us%2Fresearch%2Fuploads%2Fprod%2F2019%2F03%2Funsaturated-type-
| families-icfp-
| 2019.pdf&data=04%7C01%7Csimonpj%40microsoft.com%7Cbd9e62e3137e4038
| 5b5f08d88d8b91e0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C1%7C63741497
| 8666235646%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzI
| iLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=dgowMlsNpH0X9fPAr498F
| Y9u8xML9n0G1nwvPN4R9HA%3D&reserved=0
| Discussion:
| https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgith
| ub.com%2Fghc-proposals%2Fghc-
| proposals%2Fpull%2F242&data=04%7C01%7Csimonpj%40microsoft.com%7Cbd
| 9e62e3137e40385b5f08d88d8b91e0%7C72f988bf86f141af91ab2d7cd011db47%7C1%
| 7C1%7C637414978666235646%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiL
| CJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=C9N0y7l
| KhZsepv0mkXbJOMDVLFi4bN5kaVW7DbXW1ro%3D&reserved=0
|
| The central idea is to allow type functions (both type families and
| type synonyms) to appear unsaturated. (Currently, all type functions
| are required syntactically to be applied to all parameters they are
| declared with.) This poses a problem for type inference, as detailed
| in both the proposal and the paper. The key question: if we have (f a
| ~ g b), can we conclude (f ~ g) and (a ~ b)? Not if either of f or g
| is a type function. This proposal thus describes a mechanism to
| introduce a new flavor of arrow, such that we can identify type
| functions by their kind. Specifically, we have regular types like
| Maybe :: Type -> @M Type (where the M stands for "matchable"), but
| type functions like F :: Type -> @U Type (where the U stands for
| "unmatchable"). Unmatchable applications can not be decomposed during
| type inference.
|
| Much of the proposal is concerned with backward-compatibility: most
| users will not want to write @M or @U after each of their arrows, so
| the proposal describes ways of defaulting this behavior to match
| (most) programmers' expectations.
|
| The proposal also includes matchability polymorphism, the ability to
| abstract over a matchability parameter.
|
| Pros:
| + This proposal greatly increases the expressiveness of Haskell's type
| system.
| + With this proposal, we can finally do proper functional programming
| in types, rather than just in terms.
| + This proposal is a key ingredient toward having dependent types, as
| + unsaturated functions are commonplace in terms, and thus should also
| be supported in types. (Allowing unsaturated functions in types was a
| key difference between Adam Gundry's proposal for dependent types
| https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fadam
| .gundry.co.uk%2Fpub%2Fthesis%2F&data=04%7C01%7Csimonpj%40microsoft
| .com%7Cbd9e62e3137e40385b5f08d88d8b91e0%7C72f988bf86f141af91ab2d7cd011
| db47%7C1%7C1%7C637414978666235646%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4w
| LjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdat
| a=wk7Xc%2Bb5FLSrndKYZ2ytJh6gO2oYiCXLDhQhdEOfSOg%3D&reserved=0,
| which requires a notion of a subset of the type and term languages
| shared in common, and mine, which makes no distinction between terms
| and types.) There is a prototype implementation.
| + The ideas are backed up by peer-reviewed research.
| + Despite focusing on type families, this work applies equally to
| ordinary functions which might be used in types once we have stronger
| support for dependent types.
|
| Cons:
| - This adds a new dimension of complexity to our kind system, by
| separating out matchable and unmatchable arrows.
| - The rules for defaulting appear convenient in practice, but are
| somewhat arbitrary.
| - The rules for defaulting care about context -- does an arrow appear
| in the type of a term or the type of a type? These rules thus go
| against the spirit of #378, which advocates for not accepting features
| that distinguish between types and terms.
|
| Recommendation: With reservations, I recommend acceptance. I think
| that the power to use higher-order programming should not be
| restricted to terms, and allowing unsaturated functions at compile
| time is necessary in order to have convenient dependent types.
| However, I am concerned about the extra complexity of matchability. A
| key open question for me is how much matchability is apparent to users
| -- even ones using some higher-order type-level programming. If
| matchability is pervasive, then I would lean against. But my
| expectation is that matchability fades into the background -- much
| like levity polymorphism (unless you want it).
|
| Open question: What to do about syntax? The proposed syntax is
| sensible. However, #370 suggests an alternative syntax that might be
| more forward-thinking.
|
| Richard
| _______________________________________________
| ghc-steering-committee mailing list
| ghc-steering-committee at haskell.org
| https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmail
| .haskell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-steering-
| committee&data=04%7C01%7Csimonpj%40microsoft.com%7Cbd9e62e3137e403
| 85b5f08d88d8b91e0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C1%7C6374149
| 78666235646%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMz
| IiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=cIlDCT4r8C8Yc0%2BOib
| Q%2F6Dv1qzBiB1PpavCdAJI3ruw%3D&reserved=0
More information about the ghc-steering-committee
mailing list