es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Haskell en línea de comandos: Ejecutando una función desde main.hs

Mi programa está compuesto por tres partes: Machine, Interpreter y Compiler.

No importa realmente lo que hace cada una, aunque estoy seguro de que podrías adivinar. Lo importante es que hay una función en Compiler.hs que devuelve una lista de Instr (que es un tipo de dato que he definido en Machine). Esta función se llama ccomp y recibe como entrada un tipo de dato Com (que es un tipo de dato que he definido en Interpreter).

ccomp :: Com -> [Instr]

ccomp (Assign v x) = acomp(x) ++ [STORE v]
ccomp (Seq c1 c2) = ccomp (c1) ++ ccomp (c2)

Mi próxima tarea es escribir una función principal que permita ejecutar la función ccomp desde la línea de comandos utilizando stack exec project-exe “Assign ‘x’ (Plus (N 5) (N 3))”

El código anterior ejecuta el archivo main.hs con el String entre comillas como argumento. El problema es que no puedo averiguar qué poner en la función principal:

module Main where

import System.Environment
import Compiler

main :: IO ()
main = do
args <- getArgs
putStrLn (ccomp (head args))

Esto no funciona, el tipo esperado para ccomp es Interpreter.Com y recibe un String. He intentado cambiar el tipo utilizando read, pero no funcionó ya que el constructor Com no estaba en el ámbito.

¿Hay alguna forma sencilla de pasar el argumento de la línea de comandos a la función ccomp que me estoy perdiendo?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, puedes usar la función read para convertir el argumento de tipo string en un valor de tipo Com especificando el tipo explícitamente. Aquí tienes una función main actualizada que debería funcionar:

    import System.Environment
    import Compiler
    import Interpreter
    
    main :: IO ()
    main = do
        args <- getArgs
        let com = read (head args) :: Com
        let instrs = ccomp com
        print instrs
    

    En esta versión, usamos read para analizar el argumento de tipo string como un valor de tipo Com. Usamos la firma de tipo :: Com para indicarle a Haskell qué tipo esperamos que sea el resultado, dado que no se puede inferir automáticamente. Luego llamamos a ccomp con este valor, que devuelve la lista de Instr, que imprimimos usando print.

    Ten en cuenta que también importamos el módulo Interpreter para asegurarnos de que el tipo Com esté dentro del ámbito de trabajo de la función read.

Comments are closed.