> On Sep 14, 2021, at 5:43 PM, Callan McGill <callan.mcg...@gmail.com> wrote: > > Following on from Richard mentioning this paper and video there was an > extremely nice version of this done recently by Sam Derbyshire using type > checker plugins that is well worth a look to see what is involved: > https://github.com/sheaf/ghc-tcplugin-api/tree/main/examples/SystemF > <https://github.com/sheaf/ghc-tcplugin-api/tree/main/examples/SystemF>
I just want to amplify that Callan above in promoting Sam's work -- an unfortunate oversight on my part. Very cool how it works with the new plugins architecture! Richard > > Best, > Callan > > On Tue, 14 Sept 2021 at 15:44, Richard Eisenberg <li...@richarde.dev > <mailto:li...@richarde.dev>> wrote: > Hi Ari, > > This is a fine idea in theory, but (at present) a poor one in practice, for > at least the following reasons: > > * GHC's internal language is based on System F, allowing polymorphism. > Modeling polymorphism in the way you describe is hard, even for a language > that supports full dependent types -- so much so that successfully doing it > (in Agda) is the subject of a recent peer-reviewed publication: > https://iohk.io/en/research/library/papers/system-f-in-agdafor-fun-and-profit/ > > <https://iohk.io/en/research/library/papers/system-f-in-agdafor-fun-and-profit/> > There is some work on encoding System F in this way in Haskell, but it's > rough: > https://www.cis.upenn.edu/~plclub/blog/2020-06-26-Strongly-typed-System-F/ > <https://www.cis.upenn.edu/~plclub/blog/2020-06-26-Strongly-typed-System-F/> > Note that GHC Core is significantly more complex than either of these more > modest languages. > > * Core is manipulated a *lot*. Having intrinsic typing means, essentially, > that every optimization would have to be proved sound, in the compiler. This > is another thing that would be wonderful in theory, but we're just very far > away from being able to achieve this in practice. > > * I don't think we'd save very much at all: any information used to make > runtime decisions must be present at runtime, and types are erased. So if we > did this, we'd still need to carry (likely via class constraints) lots of > information around to runtime. The difference would be that it would be > passed implicitly instead of explicitly, but doing this won't speed GHC up. > > * I actually tried something like this while on holiday a few years ago: I > wanted to label Coercions with their role. This is a tempting subset of the > challenge you describe, because roles are very first-order (there are only 3 > of them!) and yet hard to get right. My work ran into no dead ends, exactly, > but it quickly required lots and lots of fancy support structures. (For > example, we would need a finite map where both keys and values are indexed by > some role. And we'd need existentials. Lots of them.) If I had more time, I > might have finished this, but there are bigger fish to fry. > > So: I'd be very happy with being able to do this as a long-term goal, but I'd > say we are years away from it -- and the best way toward it is simply adding > support for dependent types. > > Richard > >> On Sep 14, 2021, at 8:38 AM, Ari Fordsham <arifords...@gmail.com >> <mailto:arifords...@gmail.com>> wrote: >> >> I don't know if this is the right forum for this, I apologise if I'm >> intruding... >> >> Are there any plans to use the type system to enforce safety in Core, via >> e.g. GADTs? This would replace much of core-lint with static checking. >> >> Conal Eliottt has done something similar in a blog post >> (http://conal.net/blog/posts/overloading-lambda#:~:text=Haskell%20source%20language.-,I,-originally%20intended%20to >> >> <http://conal.net/blog/posts/overloading-lambda#:~:text=Haskell%20source%20language.-,I,-originally%20intended%20to>) >> and it seems relatively straightforward. >> >> This would be especially beneficial to those working at the cutting edge of >> GHC features, statically ensuring their Core manipulations are correct. I >> would be surprised if existing compiler bugs wouldn't be found while >> implementing this. >> >> What would the performance impact be? would using GADTs incur extra >> overhead? I'd assume you'd save something by lugging around less type >> information in Core. >> >> Ari Fordsham >> _______________________________________________ >> ghc-devs mailing list >> ghc-devs@haskell.org <mailto:ghc-devs@haskell.org> >> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs >> <http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs> > > _______________________________________________ > ghc-devs mailing list > ghc-devs@haskell.org <mailto:ghc-devs@haskell.org> > http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs > <http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs>
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs