
Hi. A concise proposal for the introduction of MPTCs in Haskell follows. A similar ghc-proposal has been written before, but without success (certainly it would be better if some experimentation in ghc was done first, as Carter suggested). The proposal is based essentially on the following (1. crucial, 2. desirable): 1. Change the ambiguty rule. Consider for example: class F a b where f:: a → b class X a where x:: a fx = f x The type of fx, (F a b, X a) ⇒ b, should not be ambiguous: in distinct contexts, fx can have distinct types (if ambiguity, and 'improvement', are as defined below). Note: agreeing with this view can lead to far-reaching consequences, e.g. support of overloaded record fields [1,Section 7], polymonads [2] etc. Further examples can be discussed but this example conveys the main idea that ambiguity should be changed; unlike the example of (show . read), no type annotation can avoid ambiguity of polymorphic fx in current Haskell. Ambiguity should be a property of an expression, defined as follows: if a constraint set C on the constrained type C∪D⇒t of an expression has unreachable variables, then satisfiability is tested for C (a definition of reachable and unreachable type variables is at the end of this message), and: - if there is a single unifying substitution of C with the set of instances in the current context (module), then C can be removed (overloading is resolved) and C∪D⇒t 'improved' to D⇒t; - otherwise there is a type error: ambiguity if there are two or more unifying substitutions of C with the set of instances in the current context (module), and unsatisfiability otherwise. 2. Allow instances to be imported (all instances are assumed to be exported): import M (instance A τ₁ ⋯ τₙ , … ) specifies that the instance of τ₁ ⋯ τₙ for class A is imported from M, in the module where the import clause occurs. In case of no explicit importation, all instances remain imported, as currently in Haskell (in order that well-typed programs remain well-typed). Comments, corrections etc. are welcome. If the ideas are welcome or lead to a related welcome proposal, then a detailed one, with changes to the Haskell report, can be worked out. (Definition: [Reachable and unreachable type variables in constraints] Consider a constrainted type C∪D⇒τ. A variable a ∈ tv(C) is reachable from V = tv(τ) if a ∈ V or if a ∈ tv(π) for some π ∈ C such that there exists b ∈ tv(π) such that b is reachable from V; otherwise it is unreachable. For example, in (F a b, X a) ⇒ b, type variable 'a' is reachable from { b }, because 'a' occurs in constraint F a b, and b is reachable. Similarly, if C = (F a b, G b c, X c), then c is reachable from {a}.) Kind regards, Carlos [1] Optional Type Classes for Haskell, Rodrigo Ribeiro, Carlos Camarão, Lucília Figueiredo, Cristiano Vasconcellos, SBLP'2016 (20th Brazilian Symposium on Programming Languages), Marília, SP, September 19-23, 2016. [2] https://github.com/carlos1camarao/ghc-proposals/blob/d81c1f26298961ac635ce07... === Em 2018-10-10 22:16, Anthony Clayden escreveu:
On Mon, 8 Oct 2018 at 8:41 PM, Simon Peyton Jones wrote
You may be interested in Carlos Camarao’s interesting work. For a long time now he has advocated (in effect) making each function into its own type class, rather that grouping them into classes. Perhaps that is in line with your thinking.
Could I ask Simon direct, since it was he who introduced the topic. When you say "interesting work", what is that evaluation based on? Is there a paper or summary you've seen that expresses the ideas? (Because despite the exhaustive and exhausting rounds on github last year, and further comment on this thread, I just can't see anything workable. And the papers that Carlos references ring alarm bells for me, just looking at the Abstracts, let alone delving into the impenetrable type theory.)
And could I ask Carlos: are we allowed to know who peer-reviewed your papers? Specifically, was it someone who's up with the state of the art in GHC?
Carlos/his team are making bold claims: to provide the functionality of FunDeps/Type functions, Overlapping Instances/Closed Type Families, to avoid the infamous `read . show` ambiguity, to avoid the equally infamous 'orphan instances' incoherence, to preserve principal typing, and to keep it "simple".
Then I have to say that if there's evidence for those claims, it's not appearing in the papers. Really the only example presented is `read . show` (plus record field disambiguation). Yes I'd hope the approach for a simple example is "simple". It doesn't seem any more simple than putting an explicit type signature (or we could use type application `@` these days). But I don't expect that would be the place to show off the power/expressivity.
Thank you AntC _______________________________________________ Haskell-prime mailing list Haskell-prime@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-prime