Supongamos que estoy trabajando con el código de una máquina de pila, que puede hacer algunas operaciones simples (empujar constante, agregar, mul, dup, swap, pop, convertir tipos) en entradas y dobles .Verificando la corrección del programa usando tipos fantasma en Haskell
Ahora el programa que estoy escribiendo toma una descripción en otro idioma y lo traduce en código para esta máquina de pila. También necesito calcular el tamaño máximo de la pila.
Sospecho que es posible utilizar el tipo Haskell corrector para eliminar algunos errores, por ejemplo:
- haciendo estallar de una pila vacía
- multiplicador de dobles utilizando int multiplicación
pensé que yo podría declarar, por ejemplo:
dup :: Stack (a :%: b) -> Stack (a :%: b :%: b)
int2double :: Stack (a :%: SInt) -> Stack (a :%: SDouble)
y así sucesivamente. Pero entonces no sé cómo generar el código y calcular el tamaño de la pila.
¿Es posible hacerlo así? ¿Y sería simple/conveniente/vale la pena?
¿Qué quiere decir con "Pero no sé cómo generar el código y calcular el tamaño de la pila". –
Pensé que estos tipos harían que aprobar los resultados sea más difícil, por ejemplo, podré escribir 'do {pushInt 2; dup; addInts} '? – mik01aj
¿Ve algún problema si usa la respuesta de sclv? –