Я определил много функций (скажем, 100+), каждый из которых выполняет конкретную работу, но с той же подписью. Это что-то вроде:
module R001 (run) where run = <do-...>
module R002 (run) where run = <do-...>
Что я хочу сделать, это обеспечить фактическое «запустить» в качестве пользовательского ввода, так что:
main = do
runWith $ read $ getLine
where
runWith :: Int -> IO ()
runWith n = R<n-padded-with-0>.run
В настоящее время я импортирую все модули квалифицированные и поставьте все RUN
s в список [может быть (IO ())]
, поэтому это работает:
runWith n = case Rs !! (read $ getLine) of
Just run -> run
Nothing -> undefined
, но как n
, я должен постоянно поддерживать большой список.
Есть ли способ определить большой список, используя templateHaskell или просто загружать соответствующий модуль по мере необходимости во время выполнения без необходимости отделить каждый модуль в разные общие библиотеки.
Основываясь на ответе Epsilonhalbe , я сделал некоторые исследования:
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
Этот блок кода принты 2 после результатов Run1
и RUN2
. Если я удалю последние две строки, это просто печатает 0. Похоже, что функции импортируются, но не ссылаются, не будут извлечены ...