5

我已经定义了很多函数(比如 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。似乎导入但未引用的函数不会被提取...

4

2 回答 2

5
于 2011-09-05T13:05:05.370 回答
1

Is it absolutely critical that the different run functions live in different modules? If you can put them all in one module, you could make run be a function of an Int (or Integer if you prefer).

module AllMyCircuits where
run 0 = {- do blah blah blah -}
run 1 = {- do blah blah blah -}
run 2 = {- do yikes -}

module Main where
import AllMyCircuits
main = readLn >>= run
于 2011-09-05T20:13:06.080 回答