我已经定义了很多函数(比如 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 放入列表中[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
run1
此代码块在和的结果之后打印 2 run2
。如果我删除最后两行,它只会打印 0。似乎导入但未引用的函数不会被提取...