Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision |
teaching:cc4101:tareas:2022-1:tarea2:parte3 [2023/05/08 14:43] – [3.1 Modificadores] obs definicion mutuamente recursiva tvallejos | teaching:cc4101:tareas:2022-1:tarea2:parte3 [2023/05/08 16:03] (current) – [3.1 Modificadores] tvallejos |
---|
| <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>} |
| |
**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}}}''. |
| |
---- | ---- |