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:29] – [3.3 Transformación a CL] obs postergación con lambda 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>} |
| |
| {<mtype> -> <mtype>} | | {<mtype> -> <mtype>} |
</code> | </code> |
(Note la definición mutuamente recursiva entre ''<type>'' y ''<mtype>'') | |
| |
* (0.1 ptos) Modifique la definición de ''Type'' para que soporte tipos con modificadores (para las distintas estrategias de evaluación no es necesario definir un tipo de dato, puede utilizar símbolos). | * (0.1 ptos) Modifique la definición de ''Type'' para que soporte tipos con modificadores (para las distintas estrategias de evaluación no es necesario definir un tipo de dato, puede utilizar símbolos). |
| |
**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. |
| |
| **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}}}''. |
| |
---- | ---- |