多くの関数 (たとえば、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
このコード ブロックは、run1
との結果に続いて 2 を出力しrun2
ます。最後の 2 行を削除すると、0 が出力されます。インポートされたが参照されていない関数は抽出されないようです...