uqbar-project / wollok

Wollok Programming Language
GNU General Public License v3.0
60 stars 16 forks source link

Métodos paramétricos avanzados #1585

Open npasserini opened 5 years ago

npasserini commented 5 years ago

El TS actualmente no puede tipar este programa. Para que esto tipe el método dibujar debería tener un tipo genérico T => T. EL tipo concreto que se infiere es (Caja|Llegada) => (Caja|Llegada), eso lleva a que cajas tenga tipo List<(Caja|Llegada)> y finalmente falla el método comprobarSiGanó.


object nivel1 {

//  LLEGADAS
        var llegadas = [new Position(4, 4), new Position(4, 3),new Position(4, 2), new Position(4, 1)]
            .map{ p => self.dibujar(new Llegada(p)) }

//  CAJAS
        var cajas = [new Position(2, 4), new Position(6, 4), new Position(4, 2), new Position(5, 2)]
            .map{ p => self.dibujar(new Caja(p, llegadas)) }

    method dibujar(dibujo) {
        game.addVisual(dibujo)
        return dibujo
    }

    method comprobarSiGano(cajas) {
        if (cajas.all{ c => c.estaBienPosicionada() }) {
            console.println("GANASTE!") 
            //game.clear()
        }
    }
}```
PalumboN commented 5 years ago

Buuuuuuu!!!! Ok, sí concuerdo con que necesitamos tipos paramétricos para los métodos. Ni idea de qué tan difícil sea eso, pero acá el error viene también por cómo se crea el tipo del método en relación con los tipos union: Ahora CREO que los métodos analizan parámetros y return types por separado. Eso, junto con la lógica de los tipos union, hace que el tipo de un método sea la union de todos sus parámetros => la union de todos los returns. Y para mi eso no está tan copado, porque pasan estas cosas. O sea, a mi me gustaría que tipe dibujar :: (Caja => Caja | Llegada => Llegada). Y de esa forma no tendríamos ese problema, porque al analizar el mensaje se podría traquear a qué rama del union pertenece a partir del parámetro y saber bien cuál es el tipo que devuelve. No se si para implementar esto necesitamos los paramétricos, si es así estamos en la misma, pero sino tal vez sea más fácil hacer esto, que además es un comportamiento que me gustaría tener.

Mientras tanto, un workaround que se me ocurre es crear el método tap para colecciones, que es como un forEach pero devuelve la misma colección (idea sacada del manejo de promises). Y como estaría en el core lo podemos tipar a mano ;) Entonces se podría hacer:

var llegadas = [new Position(4, 4), new Position(4, 3),new Position(4, 2), new Position(4, 1)]
            .map{ p => new Llegada(p) }
            .tap{ llegada => game.addVisual(llegada) }
lspigariol commented 5 years ago

reavivo viejo issue...

¿como estan pensando el tipado parametrico? al menos como horizonte

en el ejemplo de dibujar,

asumo que la inferencia de Caja o Llegada se infiere por el addVisual( ) y porque son los únicos "posicionables" del proyecto, ¿o lo acota por los dos usos y tiene que ver con #1745 ?

npasserini commented 5 years ago
  • que infiera (Caja => Caja | Llegada => Llegada) me resulta raro
  • que sea T => T calculo que es incompleto, *¿ lo que se busca expresar de alguna manera es T =>T con T = Caja|Llegada ?

T=>T es poco útil. Entiendo que nuestro ts no hace eso en ningún caso. Las otras dos opciones son equivalentes.

asumo que la inferencia de Caja o Llegada se infiere por el addVisual( ) y porque son los únicos "posicionables" del proyecto, ¿o lo acota por los dos usos y tiene que ver con #1745 https://github.com/uqbar-project/wollok/issues/1745 ?

No estoy seguro de que estén relacionados.

1745 parece más bien un bug, debería el ts poder hacer eso.

Esto acá es un feature nuevo que requiere otro desarrollo más profundo.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/uqbar-project/wollok/issues/1585?email_source=notifications&email_token=ABDLKOOWQSBEPFNLSKEZL4DQFVAG3A5CNFSM4GZX3442YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD4ZV5LI#issuecomment-523460269, or mute the thread https://github.com/notifications/unsubscribe-auth/ABDLKOIPN253ZP3GCSWZTQ3QFVAG3ANCNFSM4GZX344Q .