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の を のリストに入れる[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 が出力されます。インポートされたが参照されていない関数は抽出されないようです...

4

2 に答える 2

5
于 2011-09-05T13:05:05.370 に答える
1

run異なる機能が異なるモジュールに存在することは絶対に重要ですか? それらをすべて 1 つのモジュールに入れることができれば、 (または必要に応じて)runの関数にすることができます。IntInteger

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 に答える