He definido muchas funciones (por ejemplo, más de 100), cada una de las cuales realiza un trabajo específico pero con la misma firma. Esto es algo así como:Cómo llamar dinámicamente a una función que se definió en varios módulos en la misma firma
module R001 (run) where run = <do-...>
module R002 (run) where run = <do-...>
lo que quiero hacer es proporcionar el 'correr' real como entrada del usuario, de tal manera que:
main = do
runWith $ read $ getLine
where
runWith :: Int -> IO()
runWith n = R<n-padded-with-0>.run
Actualmente, importación, en todos los módulos, y poner toda la run
's en una lista de [Maybe (IO())]
, por lo que esto funciona:
runWith n = case Rs !! (read $ getLine) of
Just run -> run
Nothing -> undefined
Pero a medida que crece la n
, tengo que mantener continuamente una lista grande.
¿Hay alguna manera de definir la lista grande usando TemplateHaskell, o simplemente cargar el módulo correspondiente según sea necesario en el tiempo de ejecución sin tener que separar cada módulo en diferentes bibliotecas compartidas.
Basado en respuesta epsilonhalbe 's, he hecho un poco de investigación:
import R1 (run1)
import R2 (run2)
test = $(functionExtractor "^run")
main :: IO()
main = do
putStrLn $ show $ length $ test
run1 -- remove on second attempt
run2 -- remove on second attempt
Este bloque de código imprime 2 siguientes los resultados de run1
y run2
. Si elimino las dos últimas líneas, simplemente imprime 0. Parece que las funciones importadas pero no referenciadas no se extraerán ...
¡Gracias! esto es muy útil, al menos 'functionExtractor' es nuevo para mí. Investigué un poco y actualicé la publicación original. – claude
Esto es bastante parecido al 'prop_ *' de QuickChekc. El marco de prueba de Haskell 'HTF' que recopila todas las pruebas de HUnit/apoyos QuickCheck en un archivo utiliza un preprocesador personalizado' {- # OPTIONS_GHC -F -pgmF htfpp # -} '. Esta es la última solución que quiero usar, pero me temo que esta es la única solución. – claude
estoy absolutamente seguro de que esta no es la única solución, pero es lo mejor que se me ocurre. – epsilonhalbe