Я определил много функций (скажем, 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
в список [Maybe (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. Кажется, что функции, импортированные, но на которые нет ссылок, не будут извлечены ...