Coder Social home page Coder Social logo

Comments (3)

nikomatsakis avatar nikomatsakis commented on September 26, 2024

I am reminded that what I have really wanted to do for some time is to handle projection equality during lowering. Specifically, I'd like to lower an impl like this:

impl<T: Iterator> Foo<T> for <T as Iterator>::Item {
}

to a clause like this:

forall<T, U> {
    (U: Foo<T>) :-
        T: Iterator,
        ProjectionEq(<U as Iterator>::Item = U)
}

right now, we detect this "dynamically" by rewriting equalities between projections as we unify. I'd prefer for unification to be simple. This keeps the solvers simple.

The main reason I've not pursued this transformation is that it will require us to deal with higher-ranked types and their instantiation. For example, how do we deal with for<'a> fn(<Slice<'a, T> as Iterator>::Item) unifying with (say) for<'b> fn(&'b T)? Currently, we will (during unification) perform the substitutions. In Lambda Prolog, it could be coded into rules because substitution is a first-class thing. But so far we've not had this in Chalk.

One side effect though of the current setup is that the SLG solver can't handle unifications of the form <T as Iterator>::Item = <T as Iterator>::Item. What winds up happening is that when we produce an answer, we try to unify the resulting goal with the original goal, which creates a fresh goal, etc. We could maybe sidestep this by not unifying answers with goals (substitution would seem to be more efficient anyway), but it's not completely trivial to do thanks to truncation. Probably still possible. But feels like not the right thing to me.

from chalk.

nikomatsakis avatar nikomatsakis commented on September 26, 2024

OK, I fixed the problem with the SLG solver. Instead of unifying the "pending goal" with the result from a query, we now take the values directly from the answer substitute and substitute them into the pending goal. This is more efficient to boot.

from chalk.

nikomatsakis avatar nikomatsakis commented on September 26, 2024

I also fixed the problem with the recursive solver by changing how we elaborate, which is kind of hacky but then again implied bounds need some care anyhow.

from chalk.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.