Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
teaching:cc4101:tareas:2022-1:tarea2:parte3 [2023/05/08 14:43] – [3.1 Modificadores] obs definicion mutuamente recursiva tvallejosteaching:cc4101:tareas:2022-1:tarea2:parte3 [2023/05/08 16:03] (current) – [3.1 Modificadores] tvallejos
Line 41: Line 41:
          | <id>          | <id>
          | {<SL> <SL>}          | {<SL> <SL>}
-         | {fun <mtype> {<sym>} <SL> ;; note el uso de mtype (tipos con modificadores)+         | {fun {<sym> : <mtype>} : <mtype> <SL> ;; note el uso de mtype (tipos con modificadores)
          | {printn <SL>}          | {printn <SL>}
  
Line 60: Line 60:
 **Hint**: si bien en la sintaxis solo existen dos modificadores, internamente es más conveniente tener 3 (incluyendo uno para eager), así todo tipo tiene un modificador. **Hint**: si bien en la sintaxis solo existen dos modificadores, internamente es más conveniente tener 3 (incluyendo uno para eager), así todo tipo tiene un modificador.
  
-**Observación**: note la definición mutuamente recursiva entre ''<type>'' y ''<mtype>''. Esta definición nos permite crear (entre otros tipos) funciones de tipo ''(lazy Num) -> (name Num)'', es decir, una función que toma como argumento una expresión que produce un Num (sin evaluarla, y la evalua de manera lazy si es necesario), y retorna una expresión que produce un Num (sin evaluarla, y deberá ser evaluada tantas veces como sea utilizada). Se puede pensar ''lazy X'' y ''name X'' como el tipo de las promesas que producen ''X''.+**Observaciones**:  
 +  * Note la definición mutuamente recursiva entre ''<type>'' y ''<mtype>''. Esta definición nos permite crear (entre otros tipos) funciones de tipo ''(lazy Num) -> (name Num)'', es decir, una función que toma como argumento una expresión que produce un Num (sin evaluarla, y la evalua de manera lazy si es necesario), y retorna una expresión que produce un Num (sin evaluarla, y deberá ser evaluada tantas veces como sea utilizada).  
 +  * Se puede pensar ''lazy X'' y ''name X'' como el tipo de las promesas que producen ''X''
 +  * Note también que los modificadores solo se pueden aplicar al dominio y al codominio. Por lo que una funcion no puede tener tipo ''{lazy {Num -> Num}}'', pero si tipo ''%%{{lazy {Num -> Num}} -> Num}%%'' o ''{Num -> {lazy {Num -> Num}}}''.
  
 ---- ----