Как динамично вызовите функцию, определенную в нескольких модулях в той же подписи

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

5
задан claude 5 September 2011 в 19:15
поделиться